summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2013-11-05 18:00:58 +0000
committerCarl Hetherington <cth@carlh.net>2013-11-05 18:00:58 +0000
commit5698918140d640b3477634504a83da0d8d71a1cf (patch)
tree2afe42950d579e53048318db7bf20dd034d4295a /src/lib
parent82caed54938683d8112615c8e65fa1456f1130ee (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.cc60
-rw-r--r--src/lib/server.h16
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