diff --git a/include/enet/enet.h b/include/enet/enet.h index b497409..b855018 100644 --- a/include/enet/enet.h +++ b/include/enet/enet.h @@ -167,8 +167,10 @@ enum ENET_PEER_PACKET_LOSS_INTERVAL = 10000, ENET_PEER_WINDOW_SIZE_SCALE = 64 * 1024, ENET_PEER_TIMEOUT_LIMIT = 32, + ENET_PEER_TIMEOUT_MINIMUM = 3000, + ENET_PEER_TIMEOUT_MAXIMUM = 30000, ENET_PEER_PING_INTERVAL = 500, - ENET_PEER_UNSEQUENCED_WINDOW_SIZE = 4 * 32 + ENET_PEER_UNSEQUENCED_WINDOW_SIZE = 4 * 32, }; typedef struct _ENetChannel @@ -206,6 +208,7 @@ typedef struct _ENetPeer enet_uint32 lastSendTime; enet_uint32 lastReceiveTime; enet_uint32 nextTimeout; + enet_uint32 earliestTimeout; enet_uint32 packetLossEpoch; enet_uint32 packetsSent; enet_uint32 packetsLost; diff --git a/peer.c b/peer.c index f5dc076..25bdd97 100644 --- a/peer.c +++ b/peer.c @@ -351,6 +351,7 @@ enet_peer_reset (ENetPeer * peer) peer -> lastSendTime = 0; peer -> lastReceiveTime = 0; peer -> nextTimeout = 0; + peer -> earliestTimeout = 0; peer -> packetLossEpoch = 0; peer -> packetsSent = 0; peer -> packetsLost = 0; diff --git a/protocol.c b/protocol.c index babd4ca..d0014f0 100644 --- a/protocol.c +++ b/protocol.c @@ -486,6 +486,7 @@ enet_protocol_handle_acknowledge (ENetHost * host, ENetEvent * event, ENetPeer * return 0; peer -> lastReceiveTime = timeCurrent; + peer -> earliestTimeout = 0; roundTripTime = ENET_TIME_DIFFERENCE (timeCurrent, receivedSentTime); @@ -948,7 +949,14 @@ enet_protocol_check_timeouts (ENetHost * host, ENetPeer * peer, ENetEvent * even if (ENET_TIME_DIFFERENCE (timeCurrent, outgoingCommand -> sentTime) < outgoingCommand -> roundTripTimeout) continue; - if (outgoingCommand -> roundTripTimeout >= outgoingCommand -> roundTripTimeoutLimit) + if(peer -> earliestTimeout == 0 || + ENET_TIME_LESS(outgoingCommand -> sentTime, peer -> earliestTimeout)) + peer -> earliestTimeout = outgoingCommand -> sentTime; + + if (peer -> earliestTimeout != 0 && + (ENET_TIME_DIFFERENCE(timeCurrent, peer -> earliestTimeout) >= ENET_PEER_TIMEOUT_MAXIMUM || + (outgoingCommand -> roundTripTimeout >= outgoingCommand -> roundTripTimeoutLimit && + ENET_TIME_DIFFERENCE(timeCurrent, peer -> earliestTimeout) >= ENET_PEER_TIMEOUT_MINIMUM))) { event -> type = ENET_EVENT_TYPE_DISCONNECT; event -> peer = peer;