public void Close(string msg = null)
    {
        if (_isCloseing || _socket == null)
        {
            return;
        }

        lock (_socket)
        {
            if (!_socket.Connected)
            {
                _socket = null;
                NetEventDispatcher.Trigger(NetEvent.Close, msg);
                return;
            }

            if (_sendQueue.Count > 0)
            {
                _isCloseing = true;
            }
            else
            {
                _socket.Close();
                _socket = null;
                NetEventDispatcher.Trigger(NetEvent.Close, msg);
            }
        }
    }
 private void ConnectCallback(IAsyncResult ar)
 {
     try
     {
         Socket sock = ar.AsyncState as Socket;
         sock.EndConnect(ar);
         NetEventDispatcher.Trigger(NetEvent.ConnectSuccess, null);
         sock.BeginReceive(_recBuffer.Bytes, _recBuffer.WriteIdx, _recBuffer.Remain, 0, ReceiveCallback, sock);
     }
     catch (Exception e)
     {
         _socket = null;
         NetEventDispatcher.Trigger(NetEvent.ConnectFail, e.ToString());
     }
     finally
     {
         _isConnecting = false;
     }
 }