diff options
Diffstat (limited to 'protocol.c')
-rw-r--r-- | protocol.c | 154 |
1 files changed, 96 insertions, 58 deletions
@@ -24,12 +24,22 @@ enet_protocol_dispatch_incoming_commands (ENetHost * host, ENetEvent * event) if (currentPeer >= & host -> peers [host -> peerCount]) currentPeer = host -> peers; - if (currentPeer -> state == ENET_PEER_STATE_ZOMBIE) + switch (currentPeer -> state) { + case ENET_PEER_STATE_CONNECTION_PENDING: + currentPeer -> state = ENET_PEER_STATE_CONNECTED; + + event -> type = ENET_EVENT_TYPE_CONNECT; + event -> peer = currentPeer; + + return 1; + + case ENET_PEER_STATE_ZOMBIE: host -> recalculateBandwidthLimits = 1; event -> type = ENET_EVENT_TYPE_DISCONNECT; event -> peer = currentPeer; + event -> data = currentPeer -> disconnectData; enet_peer_reset (currentPeer); @@ -67,6 +77,43 @@ enet_protocol_dispatch_incoming_commands (ENetHost * host, ENetEvent * event) } static void +enet_protocol_notify_connect (ENetHost * host, ENetPeer * peer, ENetEvent * event) +{ + host -> recalculateBandwidthLimits = 1; + + if (event == NULL) + peer -> state = ENET_PEER_STATE_CONNECTION_PENDING; + else + { + peer -> state = ENET_PEER_STATE_CONNECTED; + + event -> type = ENET_EVENT_TYPE_CONNECT; + event -> peer = peer; + } +} + +static void +enet_protocol_notify_disconnect (ENetHost * host, ENetPeer * peer, ENetEvent * event) +{ + if (peer -> state >= ENET_PEER_STATE_CONNECTION_PENDING) + host -> recalculateBandwidthLimits = 1; + + if (peer -> state < ENET_PEER_STATE_CONNECTED) + enet_peer_reset (peer); + else + if (event == NULL) + peer -> state = ENET_PEER_STATE_ZOMBIE; + else + { + event -> type = ENET_EVENT_TYPE_DISCONNECT; + event -> peer = peer; + event -> data = 0; + + enet_peer_reset (peer); + } +} + +static void enet_protocol_remove_sent_unreliable_commands (ENetPeer * peer) { ENetOutgoingCommand * outgoingCommand; @@ -461,12 +508,18 @@ enet_protocol_handle_disconnect (ENetHost * host, ENetPeer * peer, const ENetPro enet_peer_reset_queues (peer); if (peer -> state != ENET_PEER_STATE_CONNECTED) - enet_peer_reset (peer); + { + if (peer -> state == ENET_PEER_STATE_CONNECTION_PENDING) host -> recalculateBandwidthLimits = 1; + + enet_peer_reset (peer); + } else if (command -> header.flags & ENET_PROTOCOL_FLAG_ACKNOWLEDGE) peer -> state = ENET_PEER_STATE_ACKNOWLEDGING_DISCONNECT; else peer -> state = ENET_PEER_STATE_ZOMBIE; + + peer -> disconnectData = command -> disconnect.data; } static int @@ -531,12 +584,7 @@ enet_protocol_handle_acknowledge (ENetHost * host, ENetEvent * event, ENetPeer * if (commandNumber != ENET_PROTOCOL_COMMAND_VERIFY_CONNECT) return 0; - host -> recalculateBandwidthLimits = 1; - - peer -> state = ENET_PEER_STATE_CONNECTED; - - event -> type = ENET_EVENT_TYPE_CONNECT; - event -> peer = peer; + enet_protocol_notify_connect (host, peer, event); return 1; @@ -544,17 +592,9 @@ enet_protocol_handle_acknowledge (ENetHost * host, ENetEvent * event, ENetPeer * if (commandNumber != ENET_PROTOCOL_COMMAND_DISCONNECT) return 0; - host -> recalculateBandwidthLimits = 1; - - event -> type = ENET_EVENT_TYPE_DISCONNECT; - event -> peer = peer; - - enet_peer_reset (peer); + enet_protocol_notify_disconnect (host, peer, event); return 1; - - default: - break; } return 0; @@ -566,7 +606,8 @@ enet_protocol_handle_verify_connect (ENetHost * host, ENetEvent * event, ENetPee enet_uint16 mtu; enet_uint32 windowSize; - if (command -> header.commandLength < sizeof (ENetProtocolVerifyConnect) || + if (event == NULL || + command -> header.commandLength < sizeof (ENetProtocolVerifyConnect) || peer -> state != ENET_PEER_STATE_CONNECTING) return; @@ -607,12 +648,7 @@ enet_protocol_handle_verify_connect (ENetHost * host, ENetEvent * event, ENetPee peer -> incomingBandwidth = ENET_NET_TO_HOST_32 (command -> verifyConnect.incomingBandwidth); peer -> outgoingBandwidth = ENET_NET_TO_HOST_32 (command -> verifyConnect.outgoingBandwidth); - host -> recalculateBandwidthLimits = 1; - - peer -> state = ENET_PEER_STATE_CONNECTED; - - event -> type = ENET_EVENT_TYPE_CONNECT; - event -> peer = peer; + enet_protocol_notify_connect (host, peer, event); } static int @@ -666,21 +702,19 @@ enet_protocol_handle_incoming_commands (ENetHost * host, ENetEvent * event) command = (ENetProtocol *) currentData; if (currentData + sizeof (ENetProtocolCommandHeader) > & host -> receivedData [host -> receivedDataLength]) - return 0; + break; command -> header.commandLength = ENET_NET_TO_HOST_32 (command -> header.commandLength); - if (currentData + command -> header.commandLength > & host -> receivedData [host -> receivedDataLength]) - return 0; + if (command -> header.commandLength <= 0 || + command -> header.commandLength > & host -> receivedData [host -> receivedDataLength] - currentData) + break; -- commandCount; currentData += command -> header.commandLength; - if (peer == NULL) - { - if (command -> header.command != ENET_PROTOCOL_COMMAND_CONNECT) - return 0; - } + if (peer == NULL && command -> header.command != ENET_PROTOCOL_COMMAND_CONNECT) + break; command -> header.reliableSequenceNumber = ENET_NET_TO_HOST_32 (command -> header.reliableSequenceNumber); @@ -765,7 +799,7 @@ enet_protocol_handle_incoming_commands (ENetHost * host, ENetEvent * event) } } - if (event -> type != ENET_EVENT_TYPE_NONE) + if (event != NULL && event -> type != ENET_EVENT_TYPE_NONE) return 1; return 0; @@ -962,10 +996,7 @@ enet_protocol_check_timeouts (ENetHost * host, ENetPeer * peer, ENetEvent * even (outgoingCommand -> roundTripTimeout >= outgoingCommand -> roundTripTimeoutLimit && ENET_TIME_DIFFERENCE(timeCurrent, peer -> earliestTimeout) >= ENET_PEER_TIMEOUT_MINIMUM))) { - event -> type = ENET_EVENT_TYPE_DISCONNECT; - event -> peer = peer; - - enet_peer_reset (peer); + enet_protocol_notify_disconnect (host, peer, event); return 1; } @@ -1198,6 +1229,7 @@ enet_host_flush (ENetHost * host) @param host host to service @param event an event structure where event details will be placed if one occurs + if event == NULL then no events will be delivered @param timeout number of milliseconds that ENet should wait for events @retval > 0 if an event occurred within the specified time limit @retval 0 if no event occurred @@ -1210,24 +1242,27 @@ enet_host_service (ENetHost * host, ENetEvent * event, enet_uint32 timeout) { enet_uint32 waitCondition; - event -> type = ENET_EVENT_TYPE_NONE; - event -> peer = NULL; - event -> packet = NULL; - - switch (enet_protocol_dispatch_incoming_commands (host, event)) + if (event != NULL) { - case 1: - return 1; + event -> type = ENET_EVENT_TYPE_NONE; + event -> peer = NULL; + event -> packet = NULL; + + switch (enet_protocol_dispatch_incoming_commands (host, event)) + { + case 1: + return 1; - case -1: - perror ("Error dispatching incoming packets"); + case -1: + perror ("Error dispatching incoming packets"); - return -1; + return -1; - default: - break; + default: + break; + } } - + timeCurrent = enet_time_get (); timeout += timeCurrent; @@ -1279,18 +1314,21 @@ enet_host_service (ENetHost * host, ENetEvent * event, enet_uint32 timeout) break; } - switch (enet_protocol_dispatch_incoming_commands (host, event)) + if (event != NULL) { - case 1: - return 1; + switch (enet_protocol_dispatch_incoming_commands (host, event)) + { + case 1: + return 1; - case -1: - perror ("Error dispatching incoming packets"); + case -1: + perror ("Error dispatching incoming packets"); - return -1; + return -1; - default: - break; + default: + break; + } } timeCurrent = enet_time_get (); |