From: Carl Hetherington Date: Sun, 17 Nov 2013 22:50:45 +0000 (+0000) Subject: Make specified-server discovery work. X-Git-Tag: v2.0.48~1142 X-Git-Url: https://main.carlh.net/gitweb/?p=dcpomatic.git;a=commitdiff_plain;h=2af7c2d9d839fb43d96e1373deff2c68721e425f Make specified-server discovery work. --- diff --git a/ChangeLog b/ChangeLog index 2ee49a1a0..fbc23ffee 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,7 @@ 2013-11-17 Carl Hetherington + * Fix specified-server discovery. + * Version 1.30 released. 2013-11-17 Carl Hetherington diff --git a/src/lib/server_finder.cc b/src/lib/server_finder.cc index a51aecd97..de90e0d5c 100644 --- a/src/lib/server_finder.cc +++ b/src/lib/server_finder.cc @@ -29,8 +29,10 @@ using std::string; using std::stringstream; using std::list; using std::vector; +using std::cout; using boost::shared_ptr; using boost::scoped_array; +using boost::lexical_cast; ServerFinder* ServerFinder::_instance = 0; @@ -69,9 +71,13 @@ ServerFinder::broadcast_thread () /* Query our `definite' servers (if there are any) */ vector servers = Config::instance()->servers (); for (vector::const_iterator i = servers.begin(); i != servers.end(); ++i) { + if (server_found (*i)) { + /* Don't bother asking a server that we already know about */ + continue; + } try { boost::asio::ip::udp::resolver resolver (io_service); - boost::asio::ip::udp::resolver::query query (*i); + boost::asio::ip::udp::resolver::query query (*i, lexical_cast (Config::instance()->server_port_base() + 1)); boost::asio::ip::udp::endpoint end_point (*resolver.resolve (query)); socket.send_to (boost::asio::buffer (data.c_str(), data.size() + 1), end_point); } catch (...) { @@ -103,15 +109,8 @@ ServerFinder::listen_thread () shared_ptr xml (new cxml::Document ("ServerAvailable")); xml->read_stream (s); - boost::mutex::scoped_lock lm (_mutex); - string const ip = sock->socket().remote_endpoint().address().to_string (); - list::const_iterator i = _servers.begin(); - while (i != _servers.end() && i->host_name() != ip) { - ++i; - } - - if (i == _servers.end ()) { + if (!server_found (ip)) { ServerDescription sd (ip, xml->number_child ("Threads")); _servers.push_back (sd); ui_signaller->emit (boost::bind (boost::ref (ServerFound), sd)); @@ -119,6 +118,18 @@ ServerFinder::listen_thread () } } +bool +ServerFinder::server_found (string ip) const +{ + boost::mutex::scoped_lock lm (_mutex); + list::const_iterator i = _servers.begin(); + while (i != _servers.end() && i->host_name() != ip) { + ++i; + } + + return i != _servers.end (); +} + void ServerFinder::connect (boost::function fn) { diff --git a/src/lib/server_finder.h b/src/lib/server_finder.h index f964d4e1a..01e26f7df 100644 --- a/src/lib/server_finder.h +++ b/src/lib/server_finder.h @@ -37,6 +37,8 @@ private: void broadcast_thread (); void listen_thread (); + bool server_found (std::string) const; + boost::signals2::signal ServerFound; bool _disabled; @@ -47,7 +49,7 @@ private: boost::thread* _listen_thread; std::list _servers; - boost::mutex _mutex; + mutable boost::mutex _mutex; static ServerFinder* _instance; };