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++;
	}
}
Пример #2
0
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++;
    }
}
Пример #3
0
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);
	}
}