private void DisconnectPeer( NetPeer peer, DisconnectReason reason, int socketErrorCode, bool sendDisconnectPacket, byte[] data, int start, int count) { if (sendDisconnectPacket) { if (count + 8 >= peer.Mtu) { //Drop additional data data = null; count = 0; NetUtils.DebugWriteError("[NM] Disconnect additional data size more than MTU - 8!"); } var disconnectPacket = _netPacketPool.Get(PacketProperty.Disconnect, 8 + count); FastBitConverter.GetBytes(disconnectPacket.RawData, 1, peer.ConnectId); if (data != null) { Buffer.BlockCopy(data, start, disconnectPacket.RawData, 9, count); } SendRawAndRecycle(disconnectPacket, peer.EndPoint); } var netEvent = CreateEvent(NetEventType.Disconnect); peer.SetDisconnectedState(); netEvent.Peer = peer; netEvent.AdditionalData = socketErrorCode; netEvent.DisconnectReason = reason; EnqueueEvent(netEvent); RemovePeer(peer.EndPoint); }