diff options
| author | Carl Hetherington <cth@carlh.net> | 2013-11-05 18:00:58 +0000 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2013-11-05 18:00:58 +0000 |
| commit | 5698918140d640b3477634504a83da0d8d71a1cf (patch) | |
| tree | 2afe42950d579e53048318db7bf20dd034d4295a /src/lib | |
| parent | 82caed54938683d8112615c8e65fa1456f1130ee (diff) | |
Oops; server should be listening from requests from the client; basic set-up.
Diffstat (limited to 'src/lib')
| -rw-r--r-- | src/lib/server.cc | 60 | ||||
| -rw-r--r-- | src/lib/server.h | 16 |
2 files changed, 53 insertions, 23 deletions
diff --git a/src/lib/server.cc b/src/lib/server.cc index 3ba7cc632..19f27ab6a 100644 --- a/src/lib/server.cc +++ b/src/lib/server.cc @@ -45,6 +45,7 @@ using std::stringstream; using std::multimap; using std::vector; using std::list; +using std::cout; using boost::shared_ptr; using boost::algorithm::is_any_of; using boost::algorithm::split; @@ -177,30 +178,9 @@ Server::run (int num_threads) _worker_threads.push_back (new thread (bind (&Server::worker_thread, this))); } - boost::asio::io_service io_service; - - /* Broadcast our presence on our interfaces */ - list<string> interfaces = network_interfaces (); - for (list<string>::iterator i = interfaces.begin(); i != interfaces.end(); ++i) { - boost::system::error_code error; - - boost::asio::ip::udp::socket socket (io_service); - socket.open (boost::asio::ip::udp::v4(), error); - if (error) { - break; - } - - socket.set_option (boost::asio::ip::udp::socket::reuse_address (true)); - socket.set_option (boost::asio::socket_base::broadcast (true)); + _broadcast.thread = new thread (bind (&Server::broadcast_thread, this)); - boost::asio::ip::udp::endpoint end_point (boost::asio::ip::address_v4::broadcast(), Config::instance()->server_port ()); - - string const data = DCPOMATIC_HELLO; - socket.send_to (boost::asio::buffer (data.c_str(), data.size() + 1), end_point); - socket.close (error); - } - - /* Wait to be given things to do */ + boost::asio::io_service io_service; boost::asio::ip::tcp::acceptor acceptor (io_service, boost::asio::ip::tcp::endpoint (boost::asio::ip::tcp::v4(), Config::instance()->server_port ())); while (1) { shared_ptr<Socket> socket (new Socket); @@ -217,3 +197,37 @@ Server::run (int num_threads) _worker_condition.notify_all (); } } + +void +Server::broadcast_thread () +{ + boost::asio::io_service io_service; + + boost::asio::ip::address address = boost::asio::ip::address_v4::any (); + boost::asio::ip::udp::endpoint listen_endpoint (address, Config::instance()->server_port ()); + + _broadcast.socket = new boost::asio::ip::udp::socket (io_service); + _broadcast.socket->open (listen_endpoint.protocol ()); + _broadcast.socket->bind (listen_endpoint); + + _broadcast.socket->async_receive_from ( + boost::asio::buffer (_broadcast.buffer, sizeof (_broadcast.buffer)), + _broadcast.send_endpoint, + boost::bind (&Server::broadcast_received, this) + ); + + io_service.run (); +} + +void +Server::broadcast_received () +{ + _broadcast.buffer[sizeof(_broadcast.buffer) - 1] = '\0'; + + cout << _broadcast.buffer << "\n"; + + _broadcast.socket->async_receive_from ( + boost::asio::buffer (_broadcast.buffer, sizeof (_broadcast.buffer)), + _broadcast.send_endpoint, boost::bind (&Server::broadcast_received, this) + ); +} diff --git a/src/lib/server.h b/src/lib/server.h index 77b51d079..55d107545 100644 --- a/src/lib/server.h +++ b/src/lib/server.h @@ -101,12 +101,28 @@ public: private: void worker_thread (); int process (boost::shared_ptr<Socket> socket); + void broadcast_thread (); + void broadcast_received (); std::vector<boost::thread *> _worker_threads; std::list<boost::shared_ptr<Socket> > _queue; boost::mutex _worker_mutex; boost::condition _worker_condition; boost::shared_ptr<Log> _log; + + struct Broadcast { + + Broadcast () + : thread (0) + , socket (0) + {} + + boost::thread* thread; + boost::asio::ip::udp::socket* socket; + char buffer[64]; + boost::asio::ip::udp::endpoint send_endpoint; + + } _broadcast; }; #endif |
