From 087d12def6acd274dceca2d090b2c9be2a966fd5 Mon Sep 17 00:00:00 2001 From: RevenantX Date: Mon, 9 May 2016 13:13:22 +0300 Subject: [PATCH] more secure close connection. --- LiteNetLib/NetClient.cs | 48 ++++++++++++++++++++++++----------------- 1 file changed, 28 insertions(+), 20 deletions(-) diff --git a/LiteNetLib/NetClient.cs b/LiteNetLib/NetClient.cs index cda8f21a..43de155f 100644 --- a/LiteNetLib/NetClient.cs +++ b/LiteNetLib/NetClient.cs @@ -16,6 +16,7 @@ public sealed class NetClient : NetBase private int _connectTimer; private ulong _connectId; private readonly string _connectKey; + private readonly object _connectionCloseLock = new object(); public NetClient(INetEventListener listener, string connectKey) : base(listener) { @@ -51,29 +52,36 @@ public bool IsConnected private void CloseConnection(bool force, string info) { - //Close threads - base.Stop(); - - //Send goodbye - if (_peer != null && !force && _connected) + lock (_connectionCloseLock) { - //Send disconnect data - var disconnectPacket = NetPacket.CreateRawPacket(PacketProperty.Disconnect, 8); - FastBitConverter.GetBytes(disconnectPacket, 1, _connectId); - _peer.SendRawData(disconnectPacket); - } + //Nothing to do + if (!IsRunning) + return; - //Clear data - _peer = null; - _connected = false; - _connectTimer = 0; - _connectAttempts = 0; - SocketClearPeers(); + //Send goodbye + if (_peer != null && !force && _connected) + { + //Send disconnect data + var disconnectPacket = NetPacket.CreateRawPacket(PacketProperty.Disconnect, 8); + FastBitConverter.GetBytes(disconnectPacket, 1, _connectId); + _peer.SendRawData(disconnectPacket); + } - //Send event to Listener - var netEvent = CreateEvent(NetEventType.Disconnect); - netEvent.AdditionalInfo = info; - EnqueueEvent(netEvent); + //Close threads and socket close + base.Stop(); + + //Clear data + _peer = null; + _connected = false; + _connectTimer = 0; + _connectAttempts = 0; + SocketClearPeers(); + + //Send event to Listener + var netEvent = CreateEvent(NetEventType.Disconnect); + netEvent.AdditionalInfo = info; + EnqueueEvent(netEvent); + } } ///