/// <inheritdoc/> protected async override Task RequestConnectionAsync(NetworkStream nStream, byte command, string destinationHost, int destinationPort, CancellationToken cancellationToken = default) { var dstPort = HostHelper.GetPortBytes(destinationPort); var userId = Array.Empty <byte>(); if (Settings.Credentials != null && !string.IsNullOrEmpty(Settings.Credentials.UserName)) { userId = Encoding.ASCII.GetBytes(Settings.Credentials.UserName); } var dstAddr = Encoding.ASCII.GetBytes(destinationHost); // REQUEST GRANT // +----+----+----+----+----+----+----+----+----+----+....+----+----+----+....+----+ // | VN | CD | DSTPORT | DSTIP | USERID |NULL| DSTADDR |NULL| // +----+----+----+----+----+----+----+----+----+----+....+----+----+----+....+----+ // 1 1 2 4 variable 1 variable 1 var request = new byte[10 + userId.Length + dstAddr.Length]; request[0] = VersionNumber; request[1] = command; dstPort.CopyTo(request, 2); byte[] dstIp = { 0, 0, 0, 1 }; dstIp.CopyTo(request, 4); userId.CopyTo(request, 8); request[8 + userId.Length] = 0x00; dstAddr.CopyTo(request, 9 + userId.Length); request[9 + userId.Length + dstAddr.Length] = 0x00; await nStream.WriteAsync(request.AsMemory(0, request.Length), cancellationToken).ConfigureAwait(false); // READ RESPONSE // +----+----+----+----+----+----+----+----+ // | VN | CD | DSTPORT | DSTIP | // +----+----+----+----+----+----+----+----+ // 1 1 2 4 var response = new byte[8]; await nStream.ReadAsync(response.AsMemory(0, 8), cancellationToken).ConfigureAwait(false); var reply = response[1]; // Если запрос не выполнен. if (reply != CommandReplyRequestGranted) { HandleCommandError(reply); } }
internal protected override void SendCommand(NetworkStream nStream, byte command, string destinationHost, int destinationPort) { byte[] dstPort = HostHelper.GetPortBytes(destinationPort); byte[] dstIp = { 0, 0, 0, 1 }; byte[] userId = new byte[0]; if (Settings.Credentials != null) { if (!String.IsNullOrEmpty(Settings.Credentials.UserName)) { userId = Encoding.ASCII.GetBytes(Settings.Credentials.UserName); } } byte[] dstAddr = Encoding.ASCII.GetBytes(destinationHost); // +----+----+----+----+----+----+----+----+----+----+....+----+----+----+....+----+ // | VN | CD | DSTPORT | DSTIP | USERID |NULL| DSTADDR |NULL| // +----+----+----+----+----+----+----+----+----+----+....+----+----+----+....+----+ // 1 1 2 4 variable 1 variable 1 byte[] request = new byte[10 + userId.Length + dstAddr.Length]; request[0] = VersionNumber; request[1] = command; dstPort.CopyTo(request, 2); dstIp.CopyTo(request, 4); userId.CopyTo(request, 8); request[8 + userId.Length] = 0x00; dstAddr.CopyTo(request, 9 + userId.Length); request[9 + userId.Length + dstAddr.Length] = 0x00; nStream.Write(request, 0, request.Length); // +----+----+----+----+----+----+----+----+ // | VN | CD | DSTPORT | DSTIP | // +----+----+----+----+----+----+----+----+ // 1 1 2 4 byte[] response = new byte[8]; nStream.Read(response, 0, 8); byte reply = response[1]; // Если запрос не выполнен. if (reply != CommandReplyRequestGranted) { HandleCommandError(reply); } }
private static async Task RequestConnectionAsync(NetworkStream nStream, byte command, string destinationHost, int destinationPort, CancellationToken cancellationToken = default) { var aTyp = GetAddressType(destinationHost); var dstAddr = GetHostAddressBytes(aTyp, destinationHost); var dstPort = HostHelper.GetPortBytes(destinationPort); // REQUEST GRANT // +----+-----+-------+------+----------+----------+ // |VER | CMD | RSV | ATYP | DST.ADDR | DST.PORT | // +----+-----+-------+------+----------+----------+ // | 1 | 1 | X'00' | 1 | Variable | 2 | // +----+-----+-------+------+----------+----------+ var request = new byte[4 + dstAddr.Length + 2]; request[0] = VersionNumber; request[1] = command; request[2] = Reserved; request[3] = aTyp; dstAddr.CopyTo(request, 4); dstPort.CopyTo(request, 4 + dstAddr.Length); await nStream.WriteAsync(request.AsMemory(0, request.Length), cancellationToken).ConfigureAwait(false); // READ RESPONSE // +----+-----+-------+------+----------+----------+ // |VER | REP | RSV | ATYP | BND.ADDR | BND.PORT | // +----+-----+-------+------+----------+----------+ // | 1 | 1 | X'00' | 1 | Variable | 2 | // +----+-----+-------+------+----------+----------+ var response = new byte[255]; await nStream.ReadAsync(response.AsMemory(0, response.Length), cancellationToken).ConfigureAwait(false); var reply = response[1]; if (reply != CommandReplySucceeded) { HandleCommandError(reply); } }
private void SendCommand(NetworkStream nStream, byte command, string destinationHost, int destinationPort) { byte aTyp = GetAddressType(destinationHost); byte[] dstAddr = HostHelper.GetHostAddressBytes(aTyp, destinationHost); byte[] dstPort = HostHelper.GetPortBytes(destinationPort); // +----+-----+-------+------+----------+----------+ // |VER | CMD | RSV | ATYP | DST.ADDR | DST.PORT | // +----+-----+-------+------+----------+----------+ // | 1 | 1 | X'00' | 1 | Variable | 2 | // +----+-----+-------+------+----------+----------+ byte[] request = new byte[4 + dstAddr.Length + 2]; request[0] = VersionNumber; request[1] = command; request[2] = Reserved; request[3] = aTyp; dstAddr.CopyTo(request, 4); dstPort.CopyTo(request, 4 + dstAddr.Length); nStream.Write(request, 0, request.Length); // +----+-----+-------+------+----------+----------+ // |VER | REP | RSV | ATYP | BND.ADDR | BND.PORT | // +----+-----+-------+------+----------+----------+ // | 1 | 1 | X'00' | 1 | Variable | 2 | // +----+-----+-------+------+----------+----------+ byte[] response = new byte[255]; nStream.Read(response, 0, response.Length); byte reply = response[1]; if (reply != CommandReplySucceeded) { HandleCommandError(reply); } }