- 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) {
+ _broadcast.thread = new thread (bind (&Server::broadcast_thread, this));
+
+ start_accept ();
+ _io_service.run ();
+}
+
+void
+Server::broadcast_thread ()
+try
+{
+ boost::asio::ip::address address = boost::asio::ip::address_v4::any ();
+ boost::asio::ip::udp::endpoint listen_endpoint (address, Config::instance()->server_port_base() + 1);
+
+ _broadcast.socket = new boost::asio::ip::udp::socket (_broadcast.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)
+ );
+
+ _broadcast.io_service.run ();
+}
+catch (...)
+{
+ store_current ();
+}
+
+void
+Server::broadcast_received ()
+{
+ _broadcast.buffer[sizeof(_broadcast.buffer) - 1] = '\0';
+
+ if (strcmp (_broadcast.buffer, DCPOMATIC_HELLO) == 0) {
+ /* Reply to the client saying what we can do */
+ xmlpp::Document doc;
+ xmlpp::Element* root = doc.create_root_node ("ServerAvailable");
+ root->add_child("Threads")->add_child_text (raw_convert<string> (_worker_threads.size ()));
+ string xml = doc.write_to_string ("UTF-8");
+
+ if (_verbose) {
+ cout << "Offering services to master " << _broadcast.send_endpoint.address().to_string () << "\n";
+ }