From 0ecc6e34b9d02e9efc149fa235334f90af50242c Mon Sep 17 00:00:00 2001 From: Benau Date: Mon, 16 Apr 2018 12:47:08 +0800 Subject: [PATCH] Add deve request for auto-server port detection --- src/network/protocols/connect_to_server.cpp | 22 +++++++++++++++++++++ src/network/stk_host.cpp | 6 ++++++ src/states_screens/online_screen.cpp | 11 +++++++---- 3 files changed, 35 insertions(+), 4 deletions(-) diff --git a/src/network/protocols/connect_to_server.cpp b/src/network/protocols/connect_to_server.cpp index c0489839d..cad785d2a 100644 --- a/src/network/protocols/connect_to_server.cpp +++ b/src/network/protocols/connect_to_server.cpp @@ -315,6 +315,28 @@ bool ConnectToServer::handleDirectConnect(int timeout) /*max_in_bandwidth*/0, /*max_out_bandwidth*/0, &ea, true/*change_port_if_bound*/); assert(dc); + if (m_server_address.getPort() == 0) + { + // Get the server port of server from (common) server discovery port + Log::info("ConnectToServer", "Detect port for server address."); + BareNetworkString s(std::string("stk-server-port")); + TransportAddress address(m_server_address.getIP(), + NetworkConfig::get()->getServerDiscoveryPort()); + dc->sendRawPacket(s, address); + TransportAddress sender; + const int LEN = 2048; + char buffer[LEN]; + int len = dc->receiveRawPacket(buffer, LEN, &sender, 2000); + if (len != 2) + { + Log::error("ConnectToServer", "Invalid port number"); + delete dc; + return false; + } + BareNetworkString server_port(buffer, len); + uint16_t port = server_port.getUInt16(); + m_server_address.setPort(port); + } ENetPeer* p = dc->connectTo(m_server_address); if (p) { diff --git a/src/network/stk_host.cpp b/src/network/stk_host.cpp index 71b6b1017..afa0c3182 100644 --- a/src/network/stk_host.cpp +++ b/src/network/stk_host.cpp @@ -959,6 +959,12 @@ void STKHost::handleDirectSocketRequest(Network* direct_socket, Log::error("STKHost", "which is not localhost - rejected."); } } + else if (command == "stk-server-port") + { + BareNetworkString s; + s.addUInt16(m_private_port); + direct_socket->sendRawPacket(s, sender); + } else Log::info("STKHost", "Received unknown command '%s'", std::string(buffer, len).c_str()); diff --git a/src/states_screens/online_screen.cpp b/src/states_screens/online_screen.cpp index 04ec57e17..9480c52d5 100644 --- a/src/states_screens/online_screen.cpp +++ b/src/states_screens/online_screen.cpp @@ -32,6 +32,7 @@ #include "network/network_config.hpp" #include "network/server.hpp" #include "network/stk_host.hpp" +#include "network/stk_peer.hpp" #include "online/request_manager.hpp" #include "states_screens/networking_lobby.hpp" #include "states_screens/online_lan.hpp" @@ -234,7 +235,8 @@ void OnlineScreen::eventCallback(Widget* widget, const std::string& name, return; } core::stringw instruction = - _("Enter the server address with IP followed by : and then port."); + _("Enter the server address with IP (optional) followed by : and" + " then port."); auto gtfd = new GeneralTextFieldDialog(instruction.c_str(), [] (const irr::core::stringw& text) {}, [this] (GUIEngine::LabelWidget* lw, @@ -242,7 +244,7 @@ void OnlineScreen::eventCallback(Widget* widget, const std::string& name, { TransportAddress server_addr( StringUtils::wideToUtf8(tb->getText())); - if (server_addr.isUnset()) + if (server_addr.getIP() == 0) { core::stringw err = _("Invalid server address: %s.", tb->getText()); @@ -269,9 +271,10 @@ void OnlineScreen::eventCallback(Widget* widget, const std::string& name, return false; } - m_entered_server_address.copy(server_addr); + m_entered_server_address.copy( + STKHost::get()->getServerPeerForClient()->getAddress()); auto cl = LobbyProtocol::create(); - cl->setAddress(server_addr); + cl->setAddress(m_entered_server_address); cl->requestStart(); return true; });