internal void DisconnectPeer( NetPeer peer, DisconnectReason reason, int socketErrorCode, bool force, byte[] data, int start, int count) { if (peer == null) { return; } if (!_peers.ContainsAddress(peer.EndPoint) || !peer.Shutdown(data, start, count, force)) { //invalid peer return; } if (force) { _peers.Remove(peer.EndPoint); } var netEvent = CreateEvent(NetEventType.Disconnect); netEvent.Peer = peer; netEvent.AdditionalData = socketErrorCode; netEvent.DisconnectReason = reason; EnqueueEvent(netEvent); }
private void RemovePeer(NetEndPoint endPoint) { _peers.Remove(endPoint); #if WINRT && !UNITY_EDITOR _socket.RemovePeer(endPoint); #endif }
//Update function private void UpdateLogic() { long startNowMs = NetTime.NowMs; NetPacket receiveBuffer = NetPacketPool.Get(PacketProperty.Sequenced, 0, NetConstants.MaxPacketSize); while (IsRunning) { #if DEBUG if (SimulateLatency) { var time = DateTime.UtcNow; lock (_pingSimulationList) { for (int i = 0; i < _pingSimulationList.Count; i++) { var incomingData = _pingSimulationList[i]; if (incomingData.TimeWhenGet <= time) { DataReceived(incomingData.Data, incomingData.Data.Length, incomingData.EndPoint); _pingSimulationList.RemoveAt(i); i--; } } } } #endif #if STATS_ENABLED ulong totalPacketLoss = 0; #endif // Flush disconnection first lock (_peers) { for (int i = 0; i < _peers.Count; i++) { NetPeer netPeer = _peers[i]; if (netPeer.ConnectionState == ConnectionState.Disconnected) { _peers.Remove(netPeer); } } //Process acks for (int i = 0; i < _peers.Count; i++) { NetPeer netPeer = _peers[i]; netPeer.Update(UpdateTime); #if STATS_ENABLED totalPacketLoss += netPeer.Statistics.PacketLoss; #endif } //Process ping for (int i = 0; i < _peers.Count; i++) { _peers[i].ProcessPong(UpdateTime); } } _socket.Receive(false, receiveBuffer.RawData); _socket.Receive(true, receiveBuffer.RawData); #if STATS_ENABLED Statistics.PacketLoss = totalPacketLoss; #endif Thread.Sleep(UpdateTime); long currentNowMs = NetTime.NowMs; long elapsedNowMs = currentNowMs - startNowMs; startNowMs = currentNowMs; AvgUpdateTime = (long)((elapsedNowMs * 6.0f + _updateTimeFilter[0] * 3.0f + _updateTimeFilter[1] * 2.0f + _updateTimeFilter[2] * 1.0f) / 12.0f); _updateTimeFilter[2] = _updateTimeFilter[1]; _updateTimeFilter[1] = _updateTimeFilter[0]; _updateTimeFilter[0] = elapsedNowMs; } }