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; } }
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); }
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(); }
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; }