internal void HandshakeSendCallback(IAsyncResult ar) { if (_closed) { return; } try { _connection.EndSend(ar); // +-----+-----+-------+------+----------+----------+ // | VER | CMD | RSV | ATYP | DST.ADDR | DST.PORT | // +-----+-----+-------+------+----------+----------+ // | 1 | 1 | X'00' | 1 | Variable | 2 | // +-----+-----+-------+------+----------+----------+ // Skip first 3 bytes, and read 2 more bytes to analysis the address. // 2 more bytes is designed if address is domain then we don't need to read once more to get the addr length. // TODO validate _connection.BeginReceive(_connetionRecvBuffer, 0, 3 + EncryptorBase.ADDR_ATYP_LEN + 1, SocketFlags.None, HandshakeReceive2Callback, null); } catch (Exception e) { Logging.LogUsefulException(e); Close(); } }