-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 ()));
- root->add_child("Version")->add_child_text (raw_convert<string> (SERVER_LINK_VERSION));
- string xml = doc.write_to_string ("UTF-8");
-
- if (_verbose) {
- cout << "Offering services to master " << _broadcast.send_endpoint.address().to_string () << "\n";
- }
- shared_ptr<Socket> socket (new Socket);
- try {
- socket->connect (boost::asio::ip::tcp::endpoint (_broadcast.send_endpoint.address(), Config::instance()->server_port_base() + 1));
- socket->write (xml.length() + 1);
- socket->write ((uint8_t *) xml.c_str(), xml.length() + 1);
- } catch (...) {
-
- }
- }
-
- _broadcast.socket->async_receive_from (
- boost::asio::buffer (_broadcast.buffer, sizeof (_broadcast.buffer)),
- _broadcast.send_endpoint, boost::bind (&Server::broadcast_received, this)
- );
-}