Oops; server should be listening from requests from the client; basic set-up.
authorCarl Hetherington <cth@carlh.net>
Tue, 5 Nov 2013 18:00:58 +0000 (18:00 +0000)
committerCarl Hetherington <cth@carlh.net>
Tue, 5 Nov 2013 18:00:58 +0000 (18:00 +0000)
src/lib/server.cc
src/lib/server.h

index 3ba7cc632f04288951b7e220646f14de67f19850..19f27ab6a663d48442e93ec7d7c4f3d21a6da0c2 100644 (file)
@@ -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)
+               );
+}
index 77b51d0798ff11da731783b63f9c624301540be1..55d1075457aa4000e96b0e8d561107bbe27eebad 100644 (file)
@@ -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