X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fencode_server_finder.cc;h=1d4ced5951f01315306259a861bf2c5645b94aa5;hb=678dd30fea0434c6febe4badc47e7aa05ebe58bc;hp=6faab0e63b829e9b65bef2672f6934295504323e;hpb=689fa55d1529ad88449ca464e9107c4dcc54d1cb;p=dcpomatic.git diff --git a/src/lib/encode_server_finder.cc b/src/lib/encode_server_finder.cc index 6faab0e63..1d4ced595 100644 --- a/src/lib/encode_server_finder.cc +++ b/src/lib/encode_server_finder.cc @@ -19,13 +19,13 @@ */ -#include "encode_server_finder.h" -#include "exceptions.h" -#include "util.h" #include "config.h" +#include "constants.h" #include "cross.h" -#include "encode_server_description.h" #include "dcpomatic_socket.h" +#include "encode_server_description.h" +#include "encode_server_finder.h" +#include "exceptions.h" #include #include #include @@ -203,64 +203,70 @@ catch (...) void EncodeServerFinder::start_accept () { - auto socket = make_shared(); + _accept_socket = make_shared(); + _listen_acceptor->async_accept ( - socket->socket(), - boost::bind(&EncodeServerFinder::handle_accept, this, boost::asio::placeholders::error, socket) + _accept_socket->socket(), + boost::bind(&EncodeServerFinder::handle_accept, this, boost::asio::placeholders::error) ); } void -EncodeServerFinder::handle_accept (boost::system::error_code ec, shared_ptr socket) +EncodeServerFinder::handle_accept (boost::system::error_code ec) { if (ec) { start_accept (); return; } - uint32_t length; - socket->read (reinterpret_cast(&length), sizeof(uint32_t)); - length = ntohl (length); + string server_available; - scoped_array buffer(new char[length]); - socket->read (reinterpret_cast(buffer.get()), length); + try { + uint32_t length; + _accept_socket->read (reinterpret_cast(&length), sizeof(uint32_t)); + length = ntohl (length); - string s (buffer.get()); - auto xml = make_shared("ServerAvailable"); - xml->read_string (s); - - auto const ip = socket->socket().remote_endpoint().address().to_string(); - auto found = server_found (ip); - if (found) { - (*found)->set_seen (); - } else { - EncodeServerDescription sd (ip, xml->number_child("Threads"), xml->optional_number_child("Version").get_value_or(0)); - { - boost::mutex::scoped_lock lm (_servers_mutex); - _servers.push_back (sd); + if (length > 65536) { + start_accept(); + return; } - emit (boost::bind(boost::ref (ServersListChanged))); - } - start_accept (); -} + scoped_array buffer(new char[length]); + _accept_socket->read (reinterpret_cast(buffer.get()), length); + server_available = buffer.get(); + } catch (NetworkError&) { + /* Maybe the server went away; let's just try again */ + start_accept(); + return; + } + auto xml = make_shared("ServerAvailable"); + xml->read_string(server_available); + + auto const ip = _accept_socket->socket().remote_endpoint().address().to_string(); + bool changed = false; + { + boost::mutex::scoped_lock lm (_servers_mutex); + auto i = _servers.begin(); + while (i != _servers.end() && i->host_name() != ip) { + ++i; + } -optional::iterator> -EncodeServerFinder::server_found (string ip) -{ - boost::mutex::scoped_lock lm (_servers_mutex); - auto i = _servers.begin(); - while (i != _servers.end() && i->host_name() != ip) { - ++i; + if (i != _servers.end()) { + i->set_seen(); + } else { + EncodeServerDescription sd (ip, xml->number_child("Threads"), xml->optional_number_child("Version").get_value_or(0)); + _servers.push_back (sd); + changed = true; + } } - if (i != _servers.end()) { - return i; + if (changed) { + emit (boost::bind(boost::ref (ServersListChanged))); } - return {}; + start_accept (); }