private void SendQueuedPackets(int currentMaxSend) { int currentSended = 0; while (currentSended < currentMaxSend) { //Get one of packets if (_reliableOrderedChannel.SendNextPacket() || _reliableUnorderedChannel.SendNextPacket() || _sequencedChannel.SendNextPacket() || _simpleChannel.SendNextPacket() || _fragmentChannel.SendNextPacket()) { currentSended++; } else { //no outgoing packets break; } } //Increase counter _sendedPacketsCount += currentSended; //If merging enabled if (_mergePos > 0) { if (_mergeCount > 1) { NetUtils.DebugWrite("Send merged: " + _mergePos + ", count: " + _mergeCount); _peerListener.SendRaw(_mergeData.RawData, 0, NetConstants.HeaderSize + _mergePos, _remoteEndPoint); } else { //Send without length information and merging _peerListener.SendRaw(_mergeData.RawData, NetConstants.HeaderSize + 2, _mergePos - 2, _remoteEndPoint); } _mergePos = 0; _mergeCount = 0; } }
internal void Update(int deltaTime) { //Get current flow mode int maxSendPacketsCount = _peerListener.GetPacketsPerSecond(_currentFlowMode); int currentMaxSend; if (maxSendPacketsCount > 0) { int availableSendPacketsCount = maxSendPacketsCount - _sendedPacketsCount; currentMaxSend = Math.Min(availableSendPacketsCount, (maxSendPacketsCount * deltaTime) / NetConstants.FlowUpdateTime); } else { currentMaxSend = int.MaxValue; } DebugWrite("[UPDATE]Delta: {0}ms, MaxSend: {1}", deltaTime, currentMaxSend); //Pending acks _reliableOrderedChannel.SendAcks(); _reliableUnorderedChannel.SendAcks(); //Pending send int currentSended = 0; while (currentSended < currentMaxSend) { //Get one of packets if (_reliableOrderedChannel.SendNextPacket() || _reliableUnorderedChannel.SendNextPacket() || _sequencedChannel.SendNextPacket() || _simpleChannel.SendNextPacket()) { currentSended++; } else { //no outgoing packets break; } } //Increase counter _sendedPacketsCount += currentSended; //ResetFlowTimer _flowTimer += deltaTime; if (_flowTimer >= NetConstants.FlowUpdateTime) { DebugWrite("[UPDATE]Reset flow timer, _sendedPackets - {0}", _sendedPacketsCount); _sendedPacketsCount = 0; _flowTimer = 0; } //Send ping _pingSendTimer += deltaTime; if (_pingSendTimer >= _pingInterval) { DebugWrite("[PP] Send ping..."); //reset timer _pingSendTimer = 0; //send ping CreateAndSend(PacketProperty.Ping, _pingSequence); //reset timer _pingTimeStart = DateTime.UtcNow; } //RTT - round trip time _rttResetTimer += deltaTime; if (_rttResetTimer >= RttResetDelay) { _rttResetTimer = 0; //Rtt update _rtt = _avgRtt; _ping = _avgRtt; _peerListener.ConnectionLatencyUpdated(this, _ping); _rttCount = 1; } //MTU - Maximum transmission unit if (!_finishMtu) { _mtuCheckTimer += deltaTime; if (_mtuCheckTimer >= MtuCheckDelay) { _mtuCheckTimer = 0; _mtuCheckAttempts++; if (_mtuCheckAttempts >= MaxMtuCheckAttempts) { _finishMtu = true; } else { lock (_mtuMutex) { //Send increased packet if (_mtuIdx < NetConstants.PossibleMtu.Length - 1) { int newMtu = NetConstants.PossibleMtu[_mtuIdx + 1] - NetConstants.HeaderSize; var p = GetPacketFromPool(PacketProperty.MtuCheck, newMtu); p.RawData[1] = (byte)(_mtuIdx + 1); SendPacket(p); } } } } } //MTU - end //Flush if (_mergePos > 0) { if (_mergeCount > 1) { DebugWrite("Send merged: " + _mergePos + ", count: " + _mergeCount); _peerListener.SendRaw(_mergeData.RawData, 0, NetConstants.HeaderSize + _mergePos, _remoteEndPoint); } else { //Send without length information and merging _peerListener.SendRaw(_mergeData.RawData, NetConstants.HeaderSize + 2, _mergePos - 2, _remoteEndPoint); } _mergePos = 0; _mergeCount = 0; } }