+#include <msp/io/print.h>
#include <msp/net/inet6.h>
#include <msp/net/resolve.h>
#include "client.h"
Net::SockAddr *addr = Net::resolve("::", "34588", Net::INET6);
server_sock = new Net::StreamServerSocket(addr->get_family());
server_sock->listen(*addr);
+ discover_sock = new Net::DatagramSocket(addr->get_family());
+ discover_sock->bind(*addr);
delete addr;
server_sock->signal_data_available.connect(sigc::mem_fun(this, &NetworkInterface::connection_available));
+ discover_sock->signal_data_available.connect(sigc::mem_fun(this, &NetworkInterface::discover_request));
event_disp.add(*server_sock);
+ event_disp.add(*discover_sock);
thread = new NetworkThread(*this);
}
clients.push_back(new Client(xinema, sock));
}
+void NetworkInterface::discover_request()
+{
+ Net::SockAddr *peer_addr;
+ char rbuf[1024];
+ discover_sock->recvfrom(rbuf, sizeof(rbuf), peer_addr);
+ discover_sock->sendto("xinema", 6, *peer_addr);
+ delete peer_addr;
+}
+
NetworkInterface::NetworkThread::NetworkThread(NetworkInterface &n):
network(n),
{
while(!done)
{
- network.event_disp.tick();
+ try
+ {
+ network.event_disp.tick();
+ }
+ catch(const std::exception &e)
+ {
+ IO::print(IO::cerr, "Unhandled exception in network thread: %s\n", e.what());
+ }
for(list<Client *>::iterator i=network.clients.begin(); i!=network.clients.end(); )
{