Я пишу (надеюсь, простое) консольное приложение для отправки команд на аудиоустройство, на котором работает 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
не отправляется, и больше нет байтов ответа для чтения.
Bytes
содержит ожидаемые байты. Совет № 2: всегда используйте отладчик и проверяйте, что каждая переменная имеет ожидаемое значение в каждый момент времени, пока выполняется ваша программа. - person zerkms   schedule 15.08.2016hex1
(hex/int 15), равен 0xFF, тогда кажется, что я Я на правильном пути, рассматривая пример процедуры согласования по следующей ссылке. Я не уверен, действительно ли это правильно или моя логика ошибочна? - person Majickal   schedule 16.08.2016s.Receive
возвращает вам длину полученного запроса. Итак,15
— это количество полученных байтов. - person zerkms   schedule 16.08.2016Bytes
и получил следующий шестнадцатеричный код: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"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