/** Attempts to dequeue any incoming queued packet. @param peer peer to dequeue packets from @param channelID channel on which to receive @returns a pointer to the packet, or NULL if there are no available incoming queued packets */ ENetPacket * enet_peer_receive (ENetPeer * peer, enet_uint8 channelID) { ENetChannel * channel = & peer -> channels [channelID]; ENetIncomingCommand * incomingCommand = NULL; ENetPacket * packet; if (! enet_list_empty (& channel -> incomingUnreliableCommands)) { incomingCommand = (ENetIncomingCommand *) enet_list_front (& channel -> incomingUnreliableCommands); if ((incomingCommand -> command.header.command & ENET_PROTOCOL_COMMAND_MASK) == ENET_PROTOCOL_COMMAND_SEND_UNRELIABLE) { if (incomingCommand -> reliableSequenceNumber != channel -> incomingReliableSequenceNumber) incomingCommand = NULL; } } if (incomingCommand == NULL && ! enet_list_empty (& channel -> incomingReliableCommands)) { incomingCommand = (ENetIncomingCommand *) enet_list_front (& channel -> incomingReliableCommands); if (incomingCommand -> fragmentsRemaining > 0 || incomingCommand -> reliableSequenceNumber != (enet_uint16) (channel -> incomingReliableSequenceNumber + 1)) return NULL; channel -> incomingReliableSequenceNumber = incomingCommand -> reliableSequenceNumber; if (incomingCommand -> fragmentCount > 0) channel -> incomingReliableSequenceNumber += incomingCommand -> fragmentCount - 1; } if (incomingCommand == NULL) return NULL; enet_list_remove (& incomingCommand -> incomingCommandList); packet = incomingCommand -> packet; -- packet -> referenceCount; if (incomingCommand -> fragments != NULL) enet_free (incomingCommand -> fragments); enet_free (incomingCommand); return packet; }
static ENetProtocolCommand enet_protocol_remove_sent_reliable_command (ENetPeer * peer, enet_uint32 reliableSequenceNumber, enet_uint8 channelID) { ENetOutgoingCommand * outgoingCommand; ENetListIterator currentCommand; ENetProtocolCommand commandNumber; for (currentCommand = enet_list_begin (& peer -> sentReliableCommands); currentCommand != enet_list_end (& peer -> sentReliableCommands); currentCommand = enet_list_next (currentCommand)) { outgoingCommand = (ENetOutgoingCommand *) currentCommand; if (outgoingCommand -> reliableSequenceNumber == reliableSequenceNumber && outgoingCommand -> command.header.channelID == channelID) break; } if (currentCommand == enet_list_end (& peer -> sentReliableCommands)) return ENET_PROTOCOL_COMMAND_NONE; commandNumber = outgoingCommand -> command.header.command; enet_list_remove (& outgoingCommand -> outgoingCommandList); if (outgoingCommand -> packet != NULL) { peer -> reliableDataInTransit -= outgoingCommand -> fragmentLength; -- outgoingCommand -> packet -> referenceCount; if (outgoingCommand -> packet -> referenceCount == 0) enet_packet_destroy (outgoingCommand -> packet); } enet_free (outgoingCommand); if (enet_list_empty (& peer -> sentReliableCommands)) return commandNumber; outgoingCommand = (ENetOutgoingCommand *) enet_list_front (& peer -> sentReliableCommands); peer -> nextTimeout = outgoingCommand -> sentTime + outgoingCommand -> roundTripTimeout; return commandNumber; }
static void enet_protocol_remove_sent_unreliable_commands (ENetPeer * peer) { ENetOutgoingCommand * outgoingCommand; while (enet_list_empty (& peer -> sentUnreliableCommands) == 0) { outgoingCommand = (ENetOutgoingCommand *) enet_list_front (& peer -> sentUnreliableCommands); enet_list_remove (& outgoingCommand -> outgoingCommandList); if (outgoingCommand -> packet != NULL) { -- outgoingCommand -> packet -> referenceCount; if (outgoingCommand -> packet -> referenceCount == 0) enet_packet_destroy (outgoingCommand -> packet); } enet_free (outgoingCommand); } }
/** Attempts to dequeue any incoming queued packet. @param peer peer to dequeue packets from @param channelID channel on which to receive @returns a pointer to the packet, or NULL if there are no available incoming queued packets */ ENetPacket * enet_peer_receive (ENetPeer * peer, enet_uint8 channelID) { ENetChannel * channel = & peer -> channels [channelID]; ENetIncomingCommand * incomingCommand = NULL; ENetPacket * packet; if (enet_list_empty (& channel -> incomingUnreliableCommands) == 0) { incomingCommand = (ENetIncomingCommand *) enet_list_front (& channel -> incomingUnreliableCommands); if (incomingCommand -> unreliableSequenceNumber > 0) { if (incomingCommand -> reliableSequenceNumber > channel -> incomingReliableSequenceNumber) incomingCommand = NULL; else channel -> incomingUnreliableSequenceNumber = incomingCommand -> unreliableSequenceNumber; } } if (incomingCommand == NULL && enet_list_empty (& channel -> incomingReliableCommands) == 0) { do { incomingCommand = (ENetIncomingCommand *) enet_list_front (& channel -> incomingReliableCommands); if (incomingCommand -> fragmentsRemaining > 0 || incomingCommand -> reliableSequenceNumber > channel -> incomingReliableSequenceNumber + 1) return NULL; if (incomingCommand -> reliableSequenceNumber <= channel -> incomingReliableSequenceNumber) { -- incomingCommand -> packet -> referenceCount; if (incomingCommand -> packet -> referenceCount == 0) enet_packet_destroy (incomingCommand -> packet); if (incomingCommand -> fragments != NULL) enet_free (incomingCommand -> fragments); enet_list_remove (& incomingCommand -> incomingCommandList); enet_free (incomingCommand); incomingCommand = NULL; } } while (incomingCommand == NULL && enet_list_empty (& channel -> incomingReliableCommands) == 0); if (incomingCommand == NULL) return NULL; channel -> incomingReliableSequenceNumber = incomingCommand -> reliableSequenceNumber; if (incomingCommand -> fragmentCount > 0) channel -> incomingReliableSequenceNumber += incomingCommand -> fragmentCount - 1; } if (incomingCommand == NULL) return NULL; enet_list_remove (& incomingCommand -> incomingCommandList); packet = incomingCommand -> packet; -- packet -> referenceCount; if (incomingCommand -> fragments != NULL) enet_free (incomingCommand -> fragments); enet_free (incomingCommand); return packet; }