Browse Source

Wait until in-flight unreliable packets are sent before disconnection

NX 6 years ago
parent
commit
7286216e3f
1 changed files with 11 additions and 3 deletions
  1. 11 3
      Source/Native/enet.h

+ 11 - 3
Source/Native/enet.h

@@ -35,7 +35,7 @@
 
 #define ENET_VERSION_MAJOR 2
 #define ENET_VERSION_MINOR 1
-#define ENET_VERSION_PATCH 6
+#define ENET_VERSION_PATCH 7
 #define ENET_VERSION_CREATE(major, minor, patch) (((major) << 16) | ((minor) << 8) | (patch))
 #define ENET_VERSION_GET_MAJOR(version) (((version) >> 16) & 0xFF)
 #define ENET_VERSION_GET_MINOR(version) (((version) >> 8) & 0xFF)
@@ -1403,7 +1403,10 @@ extern "C" {
 	static void enet_protocol_remove_sent_unreliable_commands(ENetPeer* peer) {
 		ENetOutgoingCommand* outgoingCommand;
 
-		while (!enet_list_empty(&peer->sentUnreliableCommands)) {
+		if (enet_list_empty(&peer->sentUnreliableCommands))
+			return;
+
+		do {
 			outgoingCommand = (ENetOutgoingCommand*)enet_list_front(&peer->sentUnreliableCommands);
 
 			enet_list_remove(&outgoingCommand->outgoingCommandList);
@@ -1420,6 +1423,11 @@ extern "C" {
 
 			enet_free(outgoingCommand);
 		}
+
+		while (!enet_list_empty(&peer->sentUnreliableCommands));
+
+		if (peer->state == ENET_PEER_STATE_DISCONNECT_LATER && enet_list_empty(&peer->outgoingReliableCommands) && enet_list_empty(&peer->outgoingUnreliableCommands) && enet_list_empty(&peer->sentReliableCommands))
+			enet_peer_disconnect(peer, peer->eventData);
 	}
 
 	static ENetProtocolCommand enet_protocol_remove_sent_reliable_command(ENetPeer* peer, enet_uint16 reliableSequenceNumber, enet_uint8 channelID) {
@@ -2478,7 +2486,7 @@ extern "C" {
 		host->commandCount = command - host->commands;
 		host->bufferCount  = buffer - host->buffers;
 
-		if (peer->state == ENET_PEER_STATE_DISCONNECT_LATER && enet_list_empty(&peer->outgoingReliableCommands) && enet_list_empty(&peer->outgoingUnreliableCommands) && enet_list_empty(&peer->sentReliableCommands))
+		if (peer->state == ENET_PEER_STATE_DISCONNECT_LATER && enet_list_empty(&peer->outgoingReliableCommands) && enet_list_empty(&peer->outgoingUnreliableCommands) && enet_list_empty(&peer->sentReliableCommands) && enet_list_empty(&peer->sentUnreliableCommands))
 			enet_peer_disconnect(peer, peer->eventData);
 	}