Fix connect to wan server in lan network
This commit is contained in:
parent
1dc7f3aa4e
commit
177c7b147c
@ -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());
|
||||
}
|
||||
|
@ -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() ||
|
||||
|
@ -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.");
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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")
|
||||
{
|
||||
|
@ -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();
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user