1 #include <msp/io/print.h>
2 #include <msp/net/inet6.h>
3 #include <msp/net/resolve.h>
5 #include "networkinterface.h"
10 NetworkInterface::NetworkInterface(Xinema &x):
13 Net::SockAddr *addr = Net::resolve("::", "34588", Net::INET6);
14 server_sock = new Net::StreamServerSocket(addr->get_family());
15 server_sock->listen(*addr);
16 discover_sock = new Net::DatagramSocket(addr->get_family());
17 discover_sock->bind(*addr);
20 server_sock->signal_data_available.connect(sigc::mem_fun(this, &NetworkInterface::connection_available));
21 discover_sock->signal_data_available.connect(sigc::mem_fun(this, &NetworkInterface::discover_request));
23 event_disp.add(*server_sock);
24 event_disp.add(*discover_sock);
26 thread = new NetworkThread(*this);
29 NetworkInterface::~NetworkInterface()
36 void NetworkInterface::connection_available()
38 Net::StreamSocket *sock = server_sock->accept();
39 event_disp.add(*sock);
40 clients.push_back(new Client(xinema, sock));
43 void NetworkInterface::discover_request()
45 Net::SockAddr *peer_addr;
47 discover_sock->recvfrom(rbuf, sizeof(rbuf), peer_addr);
48 discover_sock->sendto("xinema", 6, *peer_addr);
53 NetworkInterface::NetworkThread::NetworkThread(NetworkInterface &n):
57 network.event_disp.add(wakeup_pipe);
61 void NetworkInterface::NetworkThread::terminate()
68 void NetworkInterface::NetworkThread::main()
74 network.event_disp.tick();
76 catch(const std::exception &e)
78 IO::print(IO::cerr, "Unhandled exception in network thread: %s\n", e.what());
81 for(list<Client *>::iterator i=network.clients.begin(); i!=network.clients.end(); )
86 network.clients.erase(i++);