Я пишу (надеюсь, простое) консольное приложение для отправки команд на аудиоустройство, на котором работает 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