C# 执行Telnet握手

C# 执行Telnet握手,c#,telnet,handshake,C#,Telnet,Handshake,我正在编写一个(希望很简单)控制台应用程序,向运行telnet的音频设备发送命令。这些命令允许我更改其中包含的DSP组件的状态,例如:ToneGen set mute true 我遇到的问题是telnet握手,我知道有许多命令从telnet服务器发送到客户端,客户端需要响应这些命令才能成功协商会话的开始。我只是不知道如何发送正确的命令。下面是我的一些不成功的尝试 以下是我目前掌握的代码: using System; using System.IO; using System.Net; using

我正在编写一个(希望很简单)控制台应用程序,向运行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
,并且没有更多的响应字节可读取

因此,我认为这里有两个核心问题:

1) 如何检测来自音频设备的握手请求
2) 如何发送适当的响应

1)如何检测来自音频设备的握手请求

byte[] buffer = new byte[1024];
int byteCount = s.Receive(buffer);
Console.WriteLine(byteCount + " Bytes Found");
DumpBytes(buffer, byteCount);
DumpBytes(缓冲区、字节数)函数:
在控制台窗口中显示
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);

提示:使用调试器并检查
字节
数组是否包含所需的字节。提示#2:始终使用调试器,并在程序执行时检查每个变量在每个时间点是否都具有预期值。@zerkms-因此,我附加了调试器,并在原始帖子中发现了更新1中记录的值,如果响应F存储在
hex1
(hex/int 15)中等于0xFF,那么在考虑下面的示例协商过程时,我的思路似乎是正确的。我不确定这是否正确,或者我的逻辑是否有缺陷?我相信
s.Receive
会返回您收到的请求的长度。因此,
15
是接收到的字节数。@zerkms因此我现在有了一个成功返回
字节的度量,并收到了以下十六进制:
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 0x27 0xFF0xFC 0x24
我不确定的是十六进制值之间的分隔符,正如您所看到的,我在上面使用了一个空格,我现在将新代码发布为更新2。现在您需要再次检查我的初始建议:
“0xFF 0xFC 0x18 0xFF 0xFD 0x20 0xFF 0xFC 0x23 0xFF 0xFD 0x27 0xFF 0xFC 0x24\n”
这不是创建字节数组的方式。只需检查字节1
,看看它是垃圾这将是另一个暗示。