diff --git a/sc2/src/sc2code/melee.c b/sc2/src/sc2code/melee.c index 4e7dc4d9b..658f6f654 100644 --- a/sc2/src/sc2code/melee.c +++ b/sc2/src/sc2code/melee.c @@ -1838,6 +1838,7 @@ DoConfirmSettings (PMELEE_STATE pMS) return FALSE; return TRUE; #else + closeDisconnectedConnections (); netInput (); SleepThread (ONE_SECOND / 120); diff --git a/sc2/src/sc2code/netplay/netconnection.c b/sc2/src/sc2code/netplay/netconnection.c index 28f4a4ea8..44e1be47b 100644 --- a/sc2/src/sc2code/netplay/netconnection.c +++ b/sc2/src/sc2code/netplay/netconnection.c @@ -165,7 +165,7 @@ closeCallback(NetDescriptor *nd) { NetConnection_doClose(conn); } -// Close and release a NetDescriptor. +// Close and release a NetConnection. void NetConnection_close(NetConnection *conn) { if (conn->nd != NULL) { @@ -176,7 +176,8 @@ NetConnection_close(NetConnection *conn) { // This would queue the close callback. conn->nd = NULL; } - NetConnection_doClose(conn); + if (!conn->stateFlags.disconnected) + NetConnection_doClose(conn); NetConnection_delete(conn); } diff --git a/sc2/src/sc2code/netplay/netmelee.c b/sc2/src/sc2code/netplay/netmelee.c index 196ea8df7..942f4f2c8 100644 --- a/sc2/src/sc2code/netplay/netmelee.c +++ b/sc2/src/sc2code/netplay/netmelee.c @@ -69,7 +69,20 @@ closeAllConnections(void) { { NetConnection *conn = netConnections[player]; - if (conn != NULL && NetConnection_isConnected(conn)) + if (conn != NULL) + closePlayerNetworkConnection(player); + } +} + +void +closeDisconnectedConnections(void) { + COUNT player; + + for (player = 0; player < NUM_PLAYERS; player++) + { + NetConnection *conn = netConnections[player]; + + if (conn != NULL && !NetConnection_isConnected(conn)) closePlayerNetworkConnection(player); } } diff --git a/sc2/src/sc2code/netplay/netmelee.h b/sc2/src/sc2code/netplay/netmelee.h index c7ad2b10c..e9dec76e9 100644 --- a/sc2/src/sc2code/netplay/netmelee.h +++ b/sc2/src/sc2code/netplay/netmelee.h @@ -34,7 +34,7 @@ extern struct NetConnection *netConnections[]; void addNetConnection(NetConnection *conn, int playerNr); void removeNetConnection(int playerNr); void closeAllConnections(void); -void closeAllConnections(void); +void closeDisconnectedConnections(void); size_t getNumNetConnections(void); struct melee_state *NetMelee_getMeleeState(NetConnection *conn);