コード例 #1
0
        /// <summary>
        /// Checks for bad packets and does retransmission or throws error
        /// </summary>
        /// <param name="arg"></param>
        void TimerCallback(Object arg)
        {
            lock (reliableMessages)
            {
                for (int n = reliableMessages.Count - 1; n >= 0; --n)
                {
                    ReliableMessage message = reliableMessages[n];

                    message.RetransmissionElapsed += timerDeltaTime;
                    if (message.RetransmissionElapsed > RetransmissionTime)
                    {
                        message.RetransmissionElapsed = TimeSpan.Zero;

                        ++message.RetransmissionCount;
                        if (message.RetransmissionCount > RetransmissionTries)
                        {
                            reliableMessages.RemoveAt(n);
                            OnTimeout?.Invoke(message);
                        }
                        else
                        {
                            SendRetransmitted(message.Buffer, message.Target, message.ID);
                        }
                    }
                }
            }
        }
コード例 #2
0
    public void bufferMessage(ReliableMessage rm, Connection connection)
    {
        int userId = connections[connection];

        if (!bufferedMessages[userId].ContainsKey(rm._MessageId))
        {
            bufferedMessages[userId].Add(rm._MessageId, rm);
        }
    }
コード例 #3
0
    public void processBufferedMessages(Connection connection)
    {
        int userId = connections[connection];

        while (bufferedMessages[userId].ContainsKey(lastAcks[userId] + 1))
        {
            ReliableMessage rm = bufferedMessages[userId][lastAcks[userId] + 1];
            lastAcks[userId] = rm._MessageId;
            bufferedMessages[userId].Remove(rm._MessageId);
            MessageHandler.ProcessMessage((GameMessage)rm, connection);
        }
    }
コード例 #4
0
 public void AddQueueWithTimeout(ReliableMessage gm, float time)
 {
     MessageQueue.Add(gm);
     if (SentFrames.ContainsKey(gm))
     {
         SentFrames[gm] = 0;
         gamemessages[gm._MessageId] = gm;
     }
     else
     {
         SentFrames.Add(gm, 0);
         gamemessages.Add(gm._MessageId, gm);
     }
 }
コード例 #5
0
    public void ReceivedACK(int ackid)
    {
        var a = 5;

        while (MessageQueue.Count > 0 && MessageQueue[0]._MessageId <= ackid)
        {
            ReliableMessage toRemove = MessageQueue[0];
            MessageQueue.RemoveAt(0);
            SentFrames.Remove(gamemessages[toRemove._MessageId]);
            gamemessages.Remove(toRemove._MessageId);
        }

        while (NoTimeOutQueue.Count() > 0 && NoTimeOutQueue[0]._MessageId <= ackid)
        {
            Debug.Log("Removing from NoTimeoutQueue ackid " + ackid);
            NoTimeOutQueue.RemoveAt(0);
        }
    }
コード例 #6
0
 public void AddQueueWithOutTimeout(ReliableMessage gm)
 {
     NoTimeOutQueue.Add(gm);
 }