2016-08-15 134 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)如何发送适当的响应。

任何帮助将不胜感激。

UPDATE 1

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

后连接hex1返回的15

UPDATE 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没有被发送,也没有进一步的回应读取字节。

+2

提示:取一个调试器并检查字节数组是否包含您期望的字节。提示#2:总是带一个调试器,并检查每个变量在程序执行时的每个时间点都有预期的值。 – zerkms

+0

@zerkms - 所以我附加了一个调试器,发现原始文章中更新1中记录的值,_if_存储在'hex1'(hex/int 15)中的响应F等于0xFF,那么看起来我在右边在考虑以下[链接](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);