1 #include <msp/net/inet6.h>
2 #include <msp/net/resolve.h>
4 #include "networkinterface.h"
9 #include <msp/io/print.h>
11 NetworkInterface::NetworkInterface(Xinema &x):
14 Net::SockAddr *addr = Net::resolve("::", "34588", Net::INET6);
15 server_sock = new Net::StreamServerSocket(addr->get_family());
16 server_sock->listen(*addr);
17 discover_sock = new Net::DatagramSocket(addr->get_family());
18 discover_sock->bind(*addr);
21 server_sock->signal_data_available.connect(sigc::mem_fun(this, &NetworkInterface::connection_available));
22 discover_sock->signal_data_available.connect(sigc::mem_fun(this, &NetworkInterface::discover_request));
24 event_disp.add(*server_sock);
25 event_disp.add(*discover_sock);
27 thread = new NetworkThread(*this);
30 NetworkInterface::~NetworkInterface()
37 void NetworkInterface::connection_available()
39 Net::StreamSocket *sock = server_sock->accept();
40 event_disp.add(*sock);
41 clients.push_back(new Client(xinema, sock));
44 void NetworkInterface::discover_request()
46 Net::SockAddr *peer_addr;
48 discover_sock->recvfrom(rbuf, sizeof(rbuf), peer_addr);
49 IO::print("Discovery beacon received from %s\n", peer_addr->str());
50 discover_sock->sendto("xinema", 6, *peer_addr);
55 NetworkInterface::NetworkThread::NetworkThread(NetworkInterface &n):
59 network.event_disp.add(wakeup_pipe);
63 void NetworkInterface::NetworkThread::terminate()
70 void NetworkInterface::NetworkThread::main()
74 network.event_disp.tick();
76 for(list<Client *>::iterator i=network.clients.begin(); i!=network.clients.end(); )
81 network.clients.erase(i++);