Skip to content

Commit e5f8b48

Browse files
committed
- Forcefully release the NAT holepunch port binding when attempting to create a game network mesh
1 parent 6078855 commit e5f8b48

4 files changed

Lines changed: 20 additions & 13 deletions

File tree

GeneralsMD/Code/GameEngine/Include/GameNetwork/GeneralsOnline/NetworkMesh.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,7 @@ class NetworkMesh
210210

211211
void ConnectToUserViaRelay(Int64 user_id);
212212

213-
void ConnectToMesh(LobbyEntry& lobby);
213+
bool ConnectToMesh(LobbyEntry& lobby);
214214

215215
void Disconnect();
216216

GeneralsMD/Code/GameEngine/Include/GameNetwork/GeneralsOnline/PortMapper.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,16 @@ class PortMapper
3232
CleanupPorts();
3333
}
3434

35+
void ForceReleaseNATPort()
36+
{
37+
if (m_NATSocket != INVALID_SOCKET)
38+
{
39+
closesocket(m_NATSocket);
40+
WSACleanup();
41+
m_NATSocket = INVALID_SOCKET;
42+
}
43+
}
44+
3545
void Tick();
3646
void StartNATCheck();
3747

GeneralsMD/Code/GameEngine/Source/GameNetwork/GeneralsOnline/NetworkMesh.cpp

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -458,7 +458,7 @@ void NetworkMesh::ConnectToSingleUser(ENetAddress addr, Int64 user_id, bool bIsR
458458
// TODO_NGMP: enet_host_destroy(server);
459459
// TODO_NGMP: enet_host_destroy(client);
460460
static bool m_bEnetInitialized = false;
461-
void NetworkMesh::ConnectToMesh(LobbyEntry& lobby)
461+
bool NetworkMesh::ConnectToMesh(LobbyEntry& lobby)
462462
{
463463
// TODO_NGMP: Cleanup properly
464464
m_mapConnections.clear();
@@ -470,7 +470,7 @@ void NetworkMesh::ConnectToMesh(LobbyEntry& lobby)
470470
// TODO_NGMP: Handle error
471471
NetworkLog("Network Init Failed!");
472472
m_bEnetInitialized = false;
473-
return;
473+
return false;
474474
}
475475
else
476476
{
@@ -482,6 +482,8 @@ void NetworkMesh::ConnectToMesh(LobbyEntry& lobby)
482482
// create server
483483
if (enetInstance == nullptr)
484484
{
485+
NGMP_OnlineServicesManager::GetInstance()->GetPortMapper().ForceReleaseNATPort();
486+
485487
server_address.host = ENET_HOST_ANY;
486488
server_address.port = NGMP_OnlineServicesManager::GetInstance()->GetPortMapper().GetOpenPort();
487489
NetworkLog("Network Listening on port %d!", server_address.port);
@@ -497,7 +499,7 @@ void NetworkMesh::ConnectToMesh(LobbyEntry& lobby)
497499
// TODO_NGMP: Handle error
498500
NetworkLog("Network Listen Failed!");
499501
m_bEnetInitialized = false;
500-
return;
502+
return false;
501503
}
502504
}
503505

@@ -509,6 +511,8 @@ void NetworkMesh::ConnectToMesh(LobbyEntry& lobby)
509511
ConnectToSingleUser(lobbyMember);
510512
}
511513
}
514+
515+
return true;
512516
}
513517

514518
void NetworkMesh::Disconnect()

GeneralsMD/Code/GameEngine/Source/GameNetwork/GeneralsOnline/PortMapper.cpp

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -293,16 +293,8 @@ void PortMapper::DetermineLocalNetworkCapabilities()
293293
void PortMapper::ForwardPort_UPnP()
294294
{
295295
#if defined(DISABLE_UPNP)
296-
bool bSucceeded = false;
297-
298-
// NOTE: dont hard fail here. not finding an exact match might be OK, some routers mangle data etc
299-
NetworkLog("PortMapper: UPnP Mapping was not validated on router, this is likely OK");
300-
if (!m_bPortMapper_AnyMappingSuccess.load() && bSucceeded) // dont overwrite a positive value with a negative
301-
{
302-
m_bPortMapper_AnyMappingSuccess.store(true);
303-
m_bPortMapper_MappingTechUsed.store(EMappingTech::UPNP);
304-
}
305296
m_bPortMapper_UPNP_Complete.store(true);
297+
return;
306298
#else
307299
const uint16_t port = m_PreferredPort.load();
308300
int error = 0;
@@ -362,6 +354,7 @@ void PortMapper::ForwardPort_NATPMP()
362354
{
363355
#if defined(DISABLE_NATPMP)
364356
m_bPortMapper_NATPMP_Complete.store(true);
357+
return;
365358
#else
366359

367360
NetworkLog("PortMapper: NAT-PMP started");

0 commit comments

Comments
 (0)