X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fnetworkinterface.cpp;h=29947e84574701ea5e2c3c36e833636f5f8124ac;hb=a1e6d14ce3a5d5415333a4d3def6c5504f4bc49b;hp=74c80dc6263aa9a17963f26ffa3e4da2a4bb09dc;hpb=8c7e5bd0d1f966af2b22293a3a0780c419fb9c95;p=xinema.git diff --git a/source/networkinterface.cpp b/source/networkinterface.cpp index 74c80dc..29947e8 100644 --- a/source/networkinterface.cpp +++ b/source/networkinterface.cpp @@ -1,3 +1,4 @@ +#include #include #include #include "client.h" @@ -12,11 +13,15 @@ NetworkInterface::NetworkInterface(Xinema &x): 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); } @@ -35,6 +40,15 @@ void NetworkInterface::connection_available() 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), @@ -55,7 +69,14 @@ void NetworkInterface::NetworkThread::main() { 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::iterator i=network.clients.begin(); i!=network.clients.end(); ) {