Fix connect to wan server in lan network

This commit is contained in:
Benau 2018-03-06 16:18:57 +08:00
parent 1dc7f3aa4e
commit 177c7b147c
7 changed files with 44 additions and 26 deletions

View File

@ -1120,6 +1120,7 @@ int handleCmdLine()
NetworkConfig::get()->setServerName(StringUtils::xmlDecode(s));
NetworkConfig::get()->setIsServer(true);
NetworkConfig::get()->setIsWAN();
NetworkConfig::get()->setIsPublicServer();
STKHost::create();
Log::info("main", "Creating a WAN server '%s'.", s.c_str());
}

View File

@ -119,7 +119,12 @@ void ConnectToServer::asynchronousUpdate()
Log::info("ConnectToServer", "Server's address known");
m_state = REQUESTING_CONNECTION;
auto request_connection =
std::make_shared<RequestConnection>(m_server);
std::make_shared<RequestConnection>(m_server,
(!NetworkConfig::m_disable_lan &&
m_server_address.getIP() ==
STKHost::get()->getPublicAddress().getIP()) ||
(NetworkConfig::get()->isLAN() ||
STKHost::get()->isClientServer()));
request_connection->requestStart();
m_current_protocol = request_connection;
// Reset timer for next usage
@ -152,7 +157,7 @@ void ConnectToServer::asynchronousUpdate()
m_state = NetworkConfig::get()->isWAN() ?
HIDING_ADDRESS : DONE;
}
if ((!NetworkConfig::m_disable_lan &&
if ((!NetworkConfig::m_disable_lan &&
m_server_address.getIP() ==
STKHost::get()->getPublicAddress().getIP()) ||
(NetworkConfig::get()->isLAN() ||

View File

@ -62,11 +62,7 @@ void GetPeerAddress::asynchronousUpdate()
m_address.setIP(ip);
uint16_t port;
uint32_t my_ip = STKHost::get()->getPublicAddress().getIP();
if (m_address.getIP() == my_ip && !NetworkConfig::m_disable_lan)
result->get("private_port", &port);
else
result->get("port", &port);
result->get("port", &port);
m_address.setPort(port);
Log::debug("GetPeerAddress", "Peer address retrieved.");

View File

@ -31,11 +31,12 @@ using namespace Online;
/** Constructor. Stores the server id.
* \param server Server to be joined.
*/
RequestConnection::RequestConnection(std::shared_ptr<Server> server)
RequestConnection::RequestConnection(std::shared_ptr<Server> server, bool lan)
: Protocol(PROTOCOL_SILENT)
{
m_server = server;
m_request = NULL;
m_lan = lan;
} // RequestConnection
// ----------------------------------------------------------------------------
@ -61,10 +62,13 @@ void RequestConnection::asynchronousUpdate()
{
case NONE:
{
if (NetworkConfig::get()->isLAN() ||
NetworkConfig::get()->isDirectConnect() ||
STKHost::get()->isClientServer())
if (m_lan)
{
if (NetworkConfig::get()->isWAN())
{
Log::info("RequestConnection",
"LAN connection to WAN server will be used.");
}
if (STKHost::get()->isClientServer())
{
// Allow up to 10 seconds for the separate process to
@ -85,7 +89,14 @@ void RequestConnection::asynchronousUpdate()
NetworkConfig::get()->setServerIdFile("");
}
BareNetworkString message(std::string("connection-request"));
STKHost::get()->sendRawPacket(message, m_server->getAddress());
// Even for real lan server the port is guaranteed to be
// the discovery port as the server info for lan is always
// sent from the discovery port
TransportAddress server_addr;
server_addr.setIP(m_server->getAddress().getIP());
server_addr.setPort(NetworkConfig::get()
->getServerDiscoveryPort());
STKHost::get()->sendRawPacket(message, server_addr);
NetworkConfig::get()->setDirectConnect(false);
m_state = DONE;
}

View File

@ -26,9 +26,12 @@ protected:
/** State of this connection. */
STATE m_state;
/** If lan connection is used which send a request to direct socket. */
bool m_lan;
public:
// --------------------------------------------------------------------
RequestConnection(std::shared_ptr<Server> server);
// ------------------------------------------------------------------------
RequestConnection(std::shared_ptr<Server> server, bool lan);
virtual ~RequestConnection();
virtual void setup() OVERRIDE;
virtual void asynchronousUpdate() OVERRIDE;

View File

@ -743,27 +743,29 @@ void STKHost::mainLoop()
ENetHost* host = m_network->getENetHost();
// A separate network connection (socket) to handle LAN requests.
Network* lan_network = NULL;
Network* direct_socket = NULL;
if ((NetworkConfig::get()->isLAN() && NetworkConfig::get()->isServer()) ||
NetworkConfig::get()->isPublicServer())
{
TransportAddress address(0,
NetworkConfig::get()->getServerDiscoveryPort());
ENetAddress eaddr = address.toEnetAddress();
lan_network = new Network(1, 1, 0, 0, &eaddr);
if (lan_network->getENetHost() == NULL)
direct_socket = new Network(1, 1, 0, 0, &eaddr);
if (direct_socket->getENetHost() == NULL)
{
delete lan_network;
lan_network = NULL;
Log::warn("STKHost", "No direct socket available, this "
"server may not be connected by lan network");
delete direct_socket;
direct_socket = NULL;
}
}
while (m_exit_flag.test_and_set())
{
auto sl = LobbyProtocol::get<ServerLobby>();
if (lan_network && sl && sl->waitingForPlayers())
if (direct_socket && sl && sl->waitingForPlayers())
{
handleDirectSocketRequest(lan_network);
handleDirectSocketRequest(direct_socket);
} // if discovery host
while (enet_host_service(host, &event, 20) != 0)
@ -813,7 +815,7 @@ void STKHost::mainLoop()
} // while enet_host_service
} // while m_exit_flag.test_and_set()
delete lan_network;
delete direct_socket;
Log::info("STKHost", "Listening has been stopped");
} // mainLoop
@ -826,13 +828,13 @@ void STKHost::mainLoop()
* message is received, will answer with a message containing server details
* (and sender IP address and port).
*/
void STKHost::handleDirectSocketRequest(Network* lan_network)
void STKHost::handleDirectSocketRequest(Network* direct_socket)
{
const int LEN=2048;
char buffer[LEN];
TransportAddress sender;
int len = lan_network->receiveRawPacket(buffer, LEN, &sender, 1);
int len = direct_socket->receiveRawPacket(buffer, LEN, &sender, 1);
if(len<=0) return;
BareNetworkString message(buffer, len);
std::string command;
@ -861,7 +863,7 @@ void STKHost::handleDirectSocketRequest(Network* lan_network)
s.addUInt8((uint8_t)
NetworkConfig::get()->getServerGameMode(race_manager->getMinorMode(),
race_manager->getMajorMode()));
lan_network->sendRawPacket(s, sender);
direct_socket->sendRawPacket(s, sender);
} // if message is server-requested
else if (command == "connection-request")
{

View File

@ -119,7 +119,7 @@ private:
STKHost(const irr::core::stringw &server_name);
virtual ~STKHost();
void init();
void handleDirectSocketRequest(Network* lan_network);
void handleDirectSocketRequest(Network* direct_socket);
// ------------------------------------------------------------------------
void mainLoop();