/// <summary> /// Flush all queued packets /// </summary> public void Flush() { if (_connectionState != ConnectionState.Connected) { return; } lock (_flushLock) { BaseChannel currentChannel = _headChannel; while (currentChannel != null) { currentChannel.SendNextPackets(); currentChannel = currentChannel.Next; } lock (_unreliableChannel) { while (_unreliableChannel.Count > 0) { NetPacket packet = _unreliableChannel.Dequeue(); SendUserData(packet); NetManager.NetPacketPool.Recycle(packet); } } SendMerged(); } }
/// <summary> /// Flush all queued packets /// </summary> public void Flush() { if (_connectionState != ConnectionState.Connected) { return; } lock (_flushLock) { BaseChannel currentChannel = _headChannel; while (currentChannel != null) { currentChannel.SendNextPackets(); currentChannel = currentChannel.Next; } SendMerged(); } }
internal void Update(int deltaTime) { Interlocked.Add(ref _timeSinceLastPacket, deltaTime); switch (_connectionState) { case ConnectionState.Connected: if (_timeSinceLastPacket > NetManager.DisconnectTimeout) { NetDebug.Write( "[UPDATE] Disconnect by timeout: {0} > {1}", _timeSinceLastPacket, NetManager.DisconnectTimeout); NetManager.DisconnectPeerForce(this, DisconnectReason.Timeout, 0, null); return; } break; case ConnectionState.ShutdownRequested: if (_timeSinceLastPacket > NetManager.DisconnectTimeout) { _connectionState = ConnectionState.Disconnected; } else { _shutdownTimer += deltaTime; if (_shutdownTimer >= ShutdownDelay) { _shutdownTimer = 0; NetManager.SendRaw(_shutdownPacket, EndPoint); } } return; case ConnectionState.Outgoing: _connectTimer += deltaTime; if (_connectTimer > NetManager.ReconnectDelay) { _connectTimer = 0; _connectAttempts++; if (_connectAttempts > NetManager.MaxConnectAttempts) { NetManager.DisconnectPeerForce(this, DisconnectReason.ConnectionFailed, 0, null); return; } //else send connect again NetManager.SendRaw(_connectRequestPacket, EndPoint); } return; case ConnectionState.Disconnected: return; } //Send ping _pingSendTimer += deltaTime; if (_pingSendTimer >= NetManager.PingInterval) { NetDebug.Write("[PP] Send ping..."); //reset timer _pingSendTimer = 0; //send ping _pingPacket.Sequence++; //ping timeout if (_pingTimer.IsRunning) { UpdateRoundTripTime((int)_pingTimer.ElapsedMilliseconds); } _pingTimer.Reset(); _pingTimer.Start(); NetManager.SendRaw(_pingPacket, EndPoint); } //RTT - round trip time _rttResetTimer += deltaTime; if (_rttResetTimer >= NetManager.PingInterval * 3) { _rttResetTimer = 0; _rtt = _avgRtt; _rttCount = 1; } UpdateMtuLogic(deltaTime); //Pending send BaseChannel currentChannel = _headChannel; while (currentChannel != null) { currentChannel.SendNextPackets(); currentChannel = currentChannel.Next; } lock (_unreliableChannel) { while (_unreliableChannel.Count > 0) { NetPacket packet = _unreliableChannel.Dequeue(); SendUserData(packet); NetManager.NetPacketPool.Recycle(packet); } } SendMerged(); }