diff options
| author | Carl Hetherington <cth@carlh.net> | 2013-11-17 22:50:45 +0000 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2013-11-17 22:50:45 +0000 |
| commit | 2af7c2d9d839fb43d96e1373deff2c68721e425f (patch) | |
| tree | 07819da969a29a3470631c5797d35066277b1903 /src | |
| parent | 03743d3230e373dbf4aa356445ac6486ed6f34bd (diff) | |
Make specified-server discovery work.
Diffstat (limited to 'src')
| -rw-r--r-- | src/lib/server_finder.cc | 29 | ||||
| -rw-r--r-- | src/lib/server_finder.h | 4 |
2 files changed, 23 insertions, 10 deletions
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<string> servers = Config::instance()->servers (); for (vector<string>::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<string> (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<cxml::Document> 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<ServerDescription>::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<int> ("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<ServerDescription>::const_iterator i = _servers.begin(); + while (i != _servers.end() && i->host_name() != ip) { + ++i; + } + + return i != _servers.end (); +} + void ServerFinder::connect (boost::function<void (ServerDescription)> 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<void (ServerDescription)> ServerFound; bool _disabled; @@ -47,7 +49,7 @@ private: boost::thread* _listen_thread; std::list<ServerDescription> _servers; - boost::mutex _mutex; + mutable boost::mutex _mutex; static ServerFinder* _instance; }; |
