1 #include <msp/net/inet6.h>
2 #include <msp/net/resolve.h>
4 #include "networkinterface.h"
9 NetworkInterface::NetworkInterface(Xinema &x):
12 Net::SockAddr *addr = Net::resolve("::", "34588", Net::INET6);
13 server_sock = new Net::StreamServerSocket(addr->get_family());
14 server_sock->listen(*addr);
15 discover_sock = new Net::DatagramSocket(addr->get_family());
16 discover_sock->bind(*addr);
19 server_sock->signal_data_available.connect(sigc::mem_fun(this, &NetworkInterface::connection_available));
20 discover_sock->signal_data_available.connect(sigc::mem_fun(this, &NetworkInterface::discover_request));
22 event_disp.add(*server_sock);
23 event_disp.add(*discover_sock);
25 thread = new NetworkThread(*this);
28 NetworkInterface::~NetworkInterface()
35 void NetworkInterface::connection_available()
37 Net::StreamSocket *sock = server_sock->accept();
38 event_disp.add(*sock);
39 clients.push_back(new Client(xinema, sock));
42 void NetworkInterface::discover_request()
44 Net::SockAddr *peer_addr;
46 discover_sock->recvfrom(rbuf, sizeof(rbuf), peer_addr);
47 discover_sock->sendto("xinema", 6, *peer_addr);
52 NetworkInterface::NetworkThread::NetworkThread(NetworkInterface &n):
56 network.event_disp.add(wakeup_pipe);
60 void NetworkInterface::NetworkThread::terminate()
67 void NetworkInterface::NetworkThread::main()
71 network.event_disp.tick();
73 for(list<Client *>::iterator i=network.clients.begin(); i!=network.clients.end(); )
78 network.clients.erase(i++);