void UDPProxyCoordinator::Update(void) { DataStructures::DefaultIndexType idx; RakNet::TimeMS curTime = RakNet::GetTimeMS(); ForwardingRequest *fw; idx=0; while (idx < forwardingRequestList.GetSize()) { fw=forwardingRequestList[idx]; if (fw->timeRequestedPings!=0 && curTime > fw->timeRequestedPings + DEFAULT_UNRESPONSIVE_PING_TIME) { fw->OrderRemainingServersToTry(); fw->timeRequestedPings=0; TryNextServer(fw->sata, fw); idx++; } else if (fw->timeoutAfterSuccess!=0 && curTime > fw->timeoutAfterSuccess) { // Forwarding request succeeded, we waited a bit to prevent duplicates. Can forget about the entry now. RakNet::OP_DELETE(fw,_FILE_AND_LINE_); forwardingRequestList.RemoveAtIndex(idx,_FILE_AND_LINE_); } else idx++; } }
void UDPProxyCoordinator::Update(void) { unsigned int idx; VENet::TimeMS curTime = VENet::GetTimeMS(); ForwardingRequest *fw; idx=0; while (idx < forwardingRequestList.Size()) { fw=forwardingRequestList[idx]; if (fw->timeRequestedPings!=0 && curTime > fw->timeRequestedPings + DEFAULT_UNRESPONSIVE_PING_TIME_COORDINATOR) { fw->OrderRemainingServersToTry(); fw->timeRequestedPings=0; TryNextServer(fw->sata, fw); idx++; } else if (fw->timeoutAfterSuccess!=0 && curTime > fw->timeoutAfterSuccess) { VENet::OP_DELETE(fw,_FILE_AND_LINE_); forwardingRequestList.RemoveAtIndex(idx); } else idx++; } }
void UDPProxyCoordinator::OnPingServersReplyFromClientToCoordinator(Packet *packet) { VENet::BitStream incomingBs(packet->data, packet->length, false); incomingBs.IgnoreBytes(2); unsigned short serversToPingSize; SystemAddress serverAddress; SenderAndTargetAddress sata; incomingBs.Read(sata.senderClientAddress); incomingBs.Read(sata.targetClientAddress); bool objectExists; unsigned int index = forwardingRequestList.GetIndexFromKey(sata, &objectExists); if (objectExists==false) return; unsigned short idx; ServerWithPing swp; ForwardingRequest *fw = forwardingRequestList[index]; if (fw->timeRequestedPings==0) return; incomingBs.Read(serversToPingSize); if (packet->systemAddress==sata.senderClientAddress) { for (idx=0; idx < serversToPingSize; idx++) { incomingBs.Read(swp.serverAddress); incomingBs.Read(swp.ping); unsigned int index2; for (index2=0; index2 < fw->sourceServerPings.Size(); index2++) { if (fw->sourceServerPings[index2].ping >= swp.ping ) break; } fw->sourceServerPings.Insert(swp, index2, _FILE_AND_LINE_); } } else { for (idx=0; idx < serversToPingSize; idx++) { incomingBs.Read(swp.serverAddress); incomingBs.Read(swp.ping); unsigned int index2; for (index2=0; index2 < fw->targetServerPings.Size(); index2++) { if (fw->targetServerPings[index2].ping >= swp.ping ) break; } fw->sourceServerPings.Insert(swp, index2, _FILE_AND_LINE_); } } if (fw->sourceServerPings.Size()>0 && fw->targetServerPings.Size()>0) { fw->OrderRemainingServersToTry(); fw->timeRequestedPings=0; TryNextServer(fw->sata, fw); } }
void UDPProxyCoordinator::OnPingServersReplyFromClientToCoordinator(Packet *packet) { RakNet::BitStream incomingBs(packet->data, packet->length, false); incomingBs.IgnoreBytes(2); unsigned short serversToPingSize; SystemAddress serverAddress; SenderAndTargetAddress sata; incomingBs.Read(sata.senderClientAddress); incomingBs.Read(sata.targetClientAddress); DataStructures::DefaultIndexType index = forwardingRequestList.GetIndexOf(sata); if (index==(DataStructures::DefaultIndexType)-1) return; unsigned short idx; ServerWithPing swp; ForwardingRequest *fw = forwardingRequestList[index]; if (fw->timeRequestedPings==0) return; incomingBs.Read(serversToPingSize); if (packet->systemAddress==sata.senderClientAddress) { for (idx=0; idx < serversToPingSize; idx++) { incomingBs.Read(swp.serverAddress); incomingBs.Read(swp.ping); fw->sourceServerPings.Push(swp, swp.ping, _FILE_AND_LINE_); } } else { for (idx=0; idx < serversToPingSize; idx++) { incomingBs.Read(swp.serverAddress); incomingBs.Read(swp.ping); fw->targetServerPings.Push(swp, swp.ping, _FILE_AND_LINE_); } } // Both systems have to give us pings to progress here. Otherwise will timeout in Update() if (fw->sourceServerPings.GetSize()>0 && fw->targetServerPings.GetSize()>0) { fw->OrderRemainingServersToTry(); fw->timeRequestedPings=0; TryNextServer(fw->sata, fw); } }