From 51411a796a803483fba9a1399df42c20516a7366 Mon Sep 17 00:00:00 2001 From: hiker Date: Tue, 10 Nov 2015 17:00:47 +1100 Subject: [PATCH] Minor refactoring of lan handling, added client's ip address and port to the answer from the client (which can later be used when the client requests a connection from a server). --- src/network/stk_host.cpp | 61 +++++++++++++++++++++------------- src/network/stk_host.hpp | 4 +++ src/online/servers_manager.cpp | 2 ++ 3 files changed, 43 insertions(+), 24 deletions(-) diff --git a/src/network/stk_host.cpp b/src/network/stk_host.cpp index 3f8c5f741..231da5149 100644 --- a/src/network/stk_host.cpp +++ b/src/network/stk_host.cpp @@ -186,6 +186,7 @@ STKHost::STKHost(const irr::core::stringw &server_name) void STKHost::init() { m_network = NULL; + m_lan_network = NULL; m_listening_thread = NULL; m_game_setup = NULL; m_is_registered = false; @@ -411,39 +412,18 @@ void* STKHost::mainLoop(void* self) STKHost* myself = (STKHost*)(self); ENetHost* host = myself->m_network->getENetHost(); - // Separate network/socket connection in case of LAN server - // listening to broadcast. - Network *discovery_host = NULL; - if(myself->isServer() && STKHost::isLAN()) { TransportAddress address(0, 2757); ENetAddress eaddr = address.toEnetAddress(); - discovery_host = new Network(1, 1, 0, 0, &eaddr); + myself->m_lan_network = new Network(1, 1, 0, 0, &eaddr); } - const int LEN=2048; - char buffer[LEN]; while (!myself->mustStopListening()) { - if(discovery_host) + if(myself->m_lan_network) { - TransportAddress sender; - int len= discovery_host->receiveRawPacket(buffer, LEN, &sender, 1); - if(len>0 && std::string(buffer, len)=="stk-server") - { - Log::verbose("STKHost", "Received LAN server query"); - std::string name = StringUtils::wide_to_utf8( - myself->get()->getServerName().c_str()); - if(name.size()>2) - name = name.substr(0, 255); - NetworkString s; - s.addUInt8((uint8_t)name.size()); - s.addString(name.c_str()); - s.addUInt8(getMaxPlayers()); - s.addUInt8(1); // FIXME: current number of connected players - discovery_host->sendRawPacket(s.getBytes(), s.size(), sender); - } // if message is server-requested + myself->handleLANRequests(); } // if discovery host while (enet_host_service(host, &event, 20) != 0) @@ -490,6 +470,39 @@ void* STKHost::mainLoop(void* self) return NULL; } // mainLoop +// ---------------------------------------------------------------------------- +void STKHost::handleLANRequests() +{ + const int LEN=2048; + char buffer[LEN]; + + TransportAddress sender; + int len = m_lan_network->receiveRawPacket(buffer, LEN, &sender, 1); + if(len<=0) return; + + if (std::string(buffer, len) == "stk-server") + { + Log::verbose("STKHost", "Received LAN server query"); + std::string name = StringUtils::wide_to_utf8(getServerName().c_str()); + // Avoid buffer overflows + if (name.size() > 255) + name = name.substr(0, 255); + + // Send the answer, consisting of server name, max players, + // current players, and the client's ip address and port + // number (which solves the problem which network interface + // might be the right one if there is more than one). + NetworkString s; + s.addUInt8((uint8_t)name.size()); + s.addString(name.c_str()); + s.addUInt8(getMaxPlayers()); + s.addUInt8(0); // FIXME: current number of connected players + s.addUInt32(sender.getIP()); + s.addUInt16(sender.getPort()); + m_lan_network->sendRawPacket(s.getBytes(), s.size(), sender); + } // if message is server-requested +} // handleLANRequests + // ---------------------------------------------------------------------------- /** \brief Tells if a peer is known. * \return True if the peer is known, false elseway. diff --git a/src/network/stk_host.hpp b/src/network/stk_host.hpp index 3ec648fe1..753d3f682 100644 --- a/src/network/stk_host.hpp +++ b/src/network/stk_host.hpp @@ -67,6 +67,9 @@ private: /** ENet host interfacing sockets. */ Network* m_network; + /** A separate network connection (socket) to handle LAN requests. */ + Network *m_lan_network; + /** Network console */ NetworkConsole *m_network_console; @@ -110,6 +113,7 @@ private: STKHost(const irr::core::stringw &server_name); virtual ~STKHost(); void init(); + void handleLANRequests(); public: diff --git a/src/online/servers_manager.cpp b/src/online/servers_manager.cpp index 183b84150..cf08d405a 100644 --- a/src/online/servers_manager.cpp +++ b/src/online/servers_manager.cpp @@ -177,6 +177,8 @@ XMLRequest* ServersManager::getLANRefreshRequest() const StringUtils::utf8_to_wide(name.c_str()); uint8_t max_players = s.getUInt8(1+name_len ); uint8_t players = s.getUInt8(1+name.size()+1); + uint32_t my_ip = s.getUInt32(1+name.size()+2); + uint32_t my_port = s.getUInt16(1+name.size()+6); ServersManager::get() ->addServer(new Server(name_w, /*lan*/true, max_players, players,