X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;ds=inline;f=src%2Flib%2Fserver_finder.cc;h=5b67d8048dc197a98d91213c4c0070de61f75d02;hb=3ace8d6c8400939a6b66743fe395a0c16a90ecf2;hp=a51aecd978dce72c47a1adf9eccdeaea17ac0f99;hpb=d99ca0a95e61b53105f765497bc465a7420e7a47;p=dcpomatic.git diff --git a/src/lib/server_finder.cc b/src/lib/server_finder.cc index a51aecd97..5b67d8048 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; @@ -45,6 +47,7 @@ ServerFinder::ServerFinder () void ServerFinder::broadcast_thread () +try { boost::system::error_code error; boost::asio::io_service io_service; @@ -69,9 +72,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 (...) { @@ -82,9 +89,14 @@ ServerFinder::broadcast_thread () dcpomatic_sleep (10); } } +catch (...) +{ + store_current (); +} void ServerFinder::listen_thread () +try { while (1) { shared_ptr sock (new Socket (10)); @@ -103,21 +115,30 @@ 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)); } } } +catch (...) +{ + store_current (); +} + +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)