]> git.tdb.fi Git - xinema.git/blobdiff - source/networkinterface.cpp
Avoid crashing due to network exceptions
[xinema.git] / source / networkinterface.cpp
index 74c80dc6263aa9a17963f26ffa3e4da2a4bb09dc..29947e84574701ea5e2c3c36e833636f5f8124ac 100644 (file)
@@ -1,3 +1,4 @@
+#include <msp/io/print.h>
 #include <msp/net/inet6.h>
 #include <msp/net/resolve.h>
 #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<Client *>::iterator i=network.clients.begin(); i!=network.clients.end(); )
                {