2016-08-15 2 views
1

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

У меня возникли проблемы с рукопожатием 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"); 

Все, что я вижу в консоли Фраза «Отправка Bytes», так что кажется, что Bytes1 не пересылается, и нет никаких дополнительных байтов ответа для чтения.

+2

Подсказка: взять отладчик и проверить массив 'Bytes' содержит байты, которые вы ожидаете. Подсказка # 2: всегда отбирайте отладчик и проверяйте, что каждая переменная имеет ожидаемое значение в каждый момент времени, пока выполняется ваша программа. – zerkms

+0

@zerkms - Итак, я подключил отладчик и обнаружил значение, указанное в обновлении 1 в исходном сообщении, _if_ ответ F, хранящийся в 'hex1' (hex/int 15), равен 0xFF, тогда кажется, что я прав отслеживать при рассмотрении процедуры согласования примера в следующем [link] (https://support.biamp.com/Tesira/Control/Telnet_session_negotiation_in_Tesira). Я не уверен, действительно ли это правильно, или если моя логика ошибочна? – Majickal

+2

Я верю 's.Receive' возвращает вам * длину * полученного запроса. Итак, '15' - сколько байтов получено. – zerkms

ответ

0

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

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); 
Смежные вопросы