Add deve request for auto-server port detection

This commit is contained in:
Benau 2018-04-16 12:47:08 +08:00
parent 12e4ba0f18
commit 0ecc6e34b9
3 changed files with 35 additions and 4 deletions

View File

@ -315,6 +315,28 @@ bool ConnectToServer::handleDirectConnect(int timeout)
/*max_in_bandwidth*/0, /*max_out_bandwidth*/0, &ea, /*max_in_bandwidth*/0, /*max_out_bandwidth*/0, &ea,
true/*change_port_if_bound*/); true/*change_port_if_bound*/);
assert(dc); 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); ENetPeer* p = dc->connectTo(m_server_address);
if (p) if (p)
{ {

View File

@ -959,6 +959,12 @@ void STKHost::handleDirectSocketRequest(Network* direct_socket,
Log::error("STKHost", "which is not localhost - rejected."); 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 else
Log::info("STKHost", "Received unknown command '%s'", Log::info("STKHost", "Received unknown command '%s'",
std::string(buffer, len).c_str()); std::string(buffer, len).c_str());

View File

@ -32,6 +32,7 @@
#include "network/network_config.hpp" #include "network/network_config.hpp"
#include "network/server.hpp" #include "network/server.hpp"
#include "network/stk_host.hpp" #include "network/stk_host.hpp"
#include "network/stk_peer.hpp"
#include "online/request_manager.hpp" #include "online/request_manager.hpp"
#include "states_screens/networking_lobby.hpp" #include "states_screens/networking_lobby.hpp"
#include "states_screens/online_lan.hpp" #include "states_screens/online_lan.hpp"
@ -234,7 +235,8 @@ void OnlineScreen::eventCallback(Widget* widget, const std::string& name,
return; return;
} }
core::stringw instruction = 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(), auto gtfd = new GeneralTextFieldDialog(instruction.c_str(),
[] (const irr::core::stringw& text) {}, [] (const irr::core::stringw& text) {},
[this] (GUIEngine::LabelWidget* lw, [this] (GUIEngine::LabelWidget* lw,
@ -242,7 +244,7 @@ void OnlineScreen::eventCallback(Widget* widget, const std::string& name,
{ {
TransportAddress server_addr( TransportAddress server_addr(
StringUtils::wideToUtf8(tb->getText())); StringUtils::wideToUtf8(tb->getText()));
if (server_addr.isUnset()) if (server_addr.getIP() == 0)
{ {
core::stringw err = _("Invalid server address: %s.", core::stringw err = _("Invalid server address: %s.",
tb->getText()); tb->getText());
@ -269,9 +271,10 @@ void OnlineScreen::eventCallback(Widget* widget, const std::string& name,
return false; return false;
} }
m_entered_server_address.copy(server_addr); m_entered_server_address.copy(
STKHost::get()->getServerPeerForClient()->getAddress());
auto cl = LobbyProtocol::create<ClientLobby>(); auto cl = LobbyProtocol::create<ClientLobby>();
cl->setAddress(server_addr); cl->setAddress(m_entered_server_address);
cl->requestStart(); cl->requestStart();
return true; return true;
}); });