//from user thread, our thread, or recv? private void SendPacket(NetPacket packet) { switch (packet.Property) { case PacketProperty.Reliable: DebugWrite("[RS]Packet reliable"); _reliableUnorderedChannel.AddToQueue(packet); break; case PacketProperty.Sequenced: DebugWrite("[RS]Packet sequenced"); _sequencedChannel.AddToQueue(packet); break; case PacketProperty.ReliableOrdered: DebugWrite("[RS]Packet reliable ordered"); _reliableOrderedChannel.AddToQueue(packet); break; case PacketProperty.None: DebugWrite("[RS]Packet simple"); if (_peerListener.GetMaxFlowMode() == -1) { SendRawData(packet.RawData); Recycle(packet); } else { _simpleChannel.AddToQueue(packet); } break; case PacketProperty.MtuCheck: if (!SendRawData(packet.RawData)) { _finishMtu = true; } Recycle(packet); break; case PacketProperty.AckReliable: case PacketProperty.AckReliableOrdered: case PacketProperty.Ping: case PacketProperty.Pong: case PacketProperty.Disconnect: case PacketProperty.MtuOk: SendRawData(packet.RawData); Recycle(packet); break; default: throw new Exception("Unknown packet property: " + packet.Property); } }
private void UpdateRoundTripTime(int roundTripTime) { //Calc average round trip time _rtt += roundTripTime; _rttCount++; _avgRtt = _rtt / _rttCount; //flowmode 0 = fastest //flowmode max = lowest if (_avgRtt < _peerListener.GetStartRtt(_currentFlowMode - 1)) { if (_currentFlowMode <= 0) { //Already maxed return; } _goodRttCount++; if (_goodRttCount > NetConstants.FlowIncreaseThreshold) { _goodRttCount = 0; _currentFlowMode--; DebugWrite("[PA]Increased flow speed, RTT: {0}, PPS: {1}", _avgRtt, _peerListener.GetPacketsPerSecond(_currentFlowMode)); } } else if (_avgRtt > _peerListener.GetStartRtt(_currentFlowMode)) { _goodRttCount = 0; if (_currentFlowMode < _peerListener.GetMaxFlowMode()) { _currentFlowMode++; DebugWrite("[PA]Decreased flow speed, RTT: {0}, PPS: {1}", _avgRtt, _peerListener.GetPacketsPerSecond(_currentFlowMode)); } } }