Выполните рукопожатие Telnet

Я пишу (надеюсь, простое) консольное приложение для отправки команд на аудиоустройство, на котором работает telnet. Эти команды позволяют мне изменять состояние содержащихся в нем компонентов DSP, например: ToneGen set mute true.

Когда у меня возникают проблемы, это рукопожатие telnet, я понимаю, что есть ряд команд, отправленных с сервера Telnet клиенту, и что клиент должен ответить на них, чтобы успешно согласовать начало сеанса. Я просто не знаю, чтобы отправить правильные команды. Ниже моя несколько неудачная попытка.

Вот код, который у меня есть до сих пор:

using System;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Text;

namespace telnetTest
{
    class Program
    {
        static void Main(string[] args)
        {
            IPAddress address = IPAddress.Parse("192.168.10.101");
            int port = 23;
            IPEndPoint endpoint = new IPEndPoint(address, port);
            Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            Console.WriteLine("Establishing Connection to {0}", address);

            s.Connect(endpoint);


            byte[] Bytes = Encoding.ASCII.GetBytes("0xFC\0xFC\0XFC");
            s.Send(Bytes);

            byte[] buffer = new byte[50];
            s.Receive(buffer);
            Console.WriteLine(Encoding.ASCII.GetString(buffer));
            Console.ReadKey();
        }
    }
}

Вывод из кода выглядит следующим образом:

Establishing Connection to 192.168.10.101
??↑?? ??#??'??$

Поэтому я думаю, что у меня есть две основные проблемы:

1) Как обнаружить запрос рукопожатия от аудиоустройства 2) Как отправить соответствующий ответ.

Любая помощь будет принята с благодарностью.

ОБНОВЛЕНИЕ 1

byte[] buffer = new byte[1024];
int vari = s.Receive(buffer);
string hex1 = vari.ToString("X");
Console.WriteLine(hex1);

После подключения hex1 возвращает значение 15

ОБНОВЛЕНИЕ 2

Console.WriteLine("Sending Bytes");
byte[] Bytes1 = Encoding.ASCII.GetBytes("0xFF 0xFC 0x18 0xFF 0xFD 0x20 0xFF 0xFC 0x23 0xFF 0xFD 0x27 0xFF 0xFC 0x24 \n");
s.Send(Bytes1);

После приведенного выше кода я ищу следующий ответ от сервера, используя следующий код:

byte[] buffer2 = new byte[1024];
int byteCount2 = s.Receive(buffer2);
Console.WriteLine(byteCount2 + " Bytes Found");

Все, что я вижу в консоли, это фраза «Отправка байтов», поэтому кажется, что Bytes1 не отправляется, и больше нет байтов ответа для чтения.


person Majickal    schedule 15.08.2016    source источник
comment
Подсказка: возьмите отладчик и проверьте, что массив Bytes содержит ожидаемые байты. Совет № 2: всегда используйте отладчик и проверяйте, что каждая переменная имеет ожидаемое значение в каждый момент времени, пока выполняется ваша программа.   -  person zerkms    schedule 15.08.2016
comment
@zerkms - Итак, я подключил отладчик и обнаружил значение, указанное в обновлении 1 в исходном сообщении, если ответ F, хранящийся в hex1 (hex/int 15), равен 0xFF, тогда кажется, что я Я на правильном пути, рассматривая пример процедуры согласования по следующей ссылке. Я не уверен, действительно ли это правильно или моя логика ошибочна?   -  person Majickal    schedule 16.08.2016
comment
Я считаю, что s.Receive возвращает вам длину полученного запроса. Итак, 15 — это количество полученных байтов.   -  person zerkms    schedule 16.08.2016
comment
@zerkms, так что теперь я успешно вернул Bytes и получил следующий шестнадцатеричный код: FF FD 18 FF FD 20 FF FD 23 FF FD 27 FF FD 24 теперь мне нужно ответить аналогичным запросом, 0xFF 0xFC 0x18 0xFF 0xFD 0x20 0xFF 0xFC 0x23 0xFF 0xFD 0x27 0xFF 0xFC 0x24 в чем я не уверен, так это в разделителе между шестнадцатеричными значениями, как вы можете см. выше, я использовал пробел, сейчас я опубликую новый код как обновление 2.   -  person Majickal    schedule 16.08.2016
comment
Теперь вам нужно еще раз проверить мое первоначальное предложение: "0xFF 0xFC 0x18 0xFF 0xFD 0x20 0xFF 0xFC 0x23 0xFF 0xFD 0x27 0xFF 0xFC 0x24 \n" это не то, как вы создаете массив байтов. Просто проверьте Bytes1 и убедитесь, что это мусор. stackoverflow.com/a/6150310/251311 - это еще одна подсказка.   -  person zerkms    schedule 16.08.2016


Ответы (1)


Поэтому я думаю, что у меня есть две основные проблемы:

1) Как обнаружить запрос подтверждения от аудиоустройства
2) Как отправить соответствующий ответ.

1) Как обнаружить запрос подтверждения от аудиоустройства

byte[] buffer = new byte[1024];
int byteCount = s.Receive(buffer);
Console.WriteLine(byteCount + " Bytes Found");
DumpBytes(buffer, byteCount);

DumpBytes(buffer, byteCount); найдена в MSDN: link отображает содержимое buffer в окне консоли, это полезно для проверки ответа от сервера telnet после подключения.

2) Как отправить соответствующий ответ (обратно на сервер telnet).

var handshake1 = new byte[] { 0xFF, 0xFC, 0x18, 0xFF, 0xFC, 0x20, 0xFF, 0xFC, 0x23, 0xFF, 0xFC, 0x27, 0xFF, 0xFC, 0x24 };
s.Send(handshake1);
person Majickal    schedule 16.08.2016