Пример #1
0
        public void AddAddress(RudpAddress address)
        {
            if (!AddressMap.ContainsKey(address.GetHashCode()))
            {
                address.Ident = (uint)Core.RndGen.Next();
                AddressMap[address.GetHashCode()] = address;
            }

            if (PrimaryAddress == null)
            {
                PrimaryAddress = address;
            }
        }
Пример #2
0
        public void AddAddress(OpCore core, RudpAddress address, bool moveFront)
        {
            Debug.Assert(address.Address.UdpPort != 0);

            foreach (RudpAddress check in Addresses)
            {
                if (check.GetHashCode() == address.GetHashCode())
                {
                    if (moveFront)
                    {
                        Addresses.Remove(check);
                        Addresses.AddFirst(check);
                    }

                    return;
                }
            }

            address.Ident = (uint)core.RndGen.Next();
            Addresses.AddLast(address);
        }
Пример #3
0
        public void SecondTimer()
        {
            int packetLoss = 0;

            if (State == RudpState.Connected)
            {
                //Debug.WriteLine(Core.User.Settings.UserName + ":" + Core.TimeNow.Second + " - Send Window: " + SendWindowSize + ", Packets Sent: " + PacketsCompleted + ", Retransmits: " + ReTransmits); //crit delete
                PacketsCompleted = 0;

                // manage send window
                packetLoss = 0;

                if (InOrderAcks > 0)
                {
                    packetLoss = ReTransmits * 100 / InOrderAcks;
                }

                ReTransmits = 0;
                InOrderAcks = 0;

                //Session.Log("PL: " + packetLoss.ToString() +
                //    ", SW: " + SendWindowSize.ToString() +
                //    ", SQ: " + SendPacketMap.Count.ToString() +
                //    ", SB: " + SendBuffLength.ToString());

                if (packetLoss < 10 && SendWindowSize < MAX_WINDOW_SIZE)
                {
                    SendWindowSize++;
                }
                if (packetLoss > 20 && SendWindowSize > 1)
                {
                    SendWindowSize /= 2;
                }


                // if data waiting to be read
                if (State == RudpState.Connected && RecvBuffLength > 0)
                {
                    Session.OnReceive();
                }


                // dead - 5 secs send ping, 10 secs reset primary addr, 15 secs close

                DateTime lastRecv = PrimaryAddress.LastAck;

                // if nothing received for 15 seconds disconnect
                if (Core.TimeNow > lastRecv.AddSeconds(15))
                {
                    RudpClose(CloseReason.TIMEOUT);
                }

                // re-analyze alternate routes after 10 secs dead, or half min interval
                else if (Core.TimeNow > lastRecv.AddSeconds(10) || Core.TimeNow > NextCheckRoutes)
                {
                    // after connection this should immediately be called to find best route

                    CheckRoutes();

                    NextCheckRoutes = Core.TimeNow.AddSeconds(30);
                }

                // send keep alive if nothing received after 5 secs
                else if (Core.TimeNow > lastRecv.AddSeconds(5))
                {
                    SendPing(PrimaryAddress);
                }
            }

            // prune addressMap to last 6 addresses seen
            while (AddressMap.Count > 6)
            {
                RudpAddress lastSeen = null;

                foreach (RudpAddress address in AddressMap.Values)
                {
                    if (lastSeen == null || address.LastAck < lastSeen.LastAck)
                    {
                        lastSeen = address;
                    }
                }

                AddressMap.Remove(lastSeen.GetHashCode());
            }

            // finishing
            if (State == RudpState.Finishing)
            {
                if (!FinSent)
                {
                    TrySendFin();
                }

                if (FinTimeout > 0)
                {
                    FinTimeout--;
                }

                if (FinTimeout == 0)
                {
                    ChangeState(RudpState.Closed);
                }

                // buffer clear, all packets acked in sequence including fins
                if (FinSent && FinReceived && SendPacketMap.Count == 0)
                {
                    ChangeState(RudpState.Closed);
                }
            }

            // re-send packets in out buffer
            if (State != RudpState.Closed)
            {
                ManageSendWindow();
            }

            // update bandwidth rate used for determining public send buffer
            AvgBytesSent.Next();

            // bandwidth stats
            Bandwidth.NextSecond();
        }
Пример #4
0
        public void AddAddress(RudpAddress address)
        {
            if (!AddressMap.ContainsKey(address.GetHashCode()))
            {
                address.Ident = (uint) Core.RndGen.Next();
                AddressMap[address.GetHashCode()] = address;
            }

            if (PrimaryAddress == null)
                PrimaryAddress = address;
        }