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;
_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);
_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)
+ );
+}
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