internal void HandshakeReceive2Callback(IAsyncResult ar) { if (_closed) { return; } try { int bytesRead = _connection.EndReceive(ar); if (bytesRead >= 5) { _command = _connetionRecvBuffer[1]; if (_command != CMD_CONNECT && _command != CMD_UDP_ASSOC) { Logging.Debug("Unsupported CMD=" + _command); Close(); } else { if (_command == CMD_CONNECT) { byte[] response = { Socks5Version, SuccessREP, Reserve, IpV4, 0, 0, 0, 0, 0, 0 }; _connection.BeginSend(response, 0, response.Length, SocketFlags.None, ResponseConnectCallback, null); } else if (_command == CMD_UDP_ASSOC) { ReadAddress(HandleUDPAssociate); } } } else { Logging.Debug( "failed to recv data in Shadowsocks.Controller.TCPHandler.handshakeReceive2Callback()"); Close(); } } catch (Exception e) { Logging.LogUsefulException(e); Close(); } }