【问题标题】:Perform a Telnet handshake执行 Telnet 握手
【发布时间】:2016-12-21 05:50:48
【问题描述】:

我正在编写一个(希望是简单的)控制台应用程序来向运行 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:始终使用调试器并检查每个变量在程序执行时的每个时间点是否具有预期值。
  • @zerkms - 所以我附加了一个调试器并发现了原始帖子中更新 1 中记录的值,if 响应 F 存储在 hex1 (hex/int 15 ) 等于 0xFF,那么在考虑以下link 中的示例协商过程时,我似乎走在了正确的轨道上。我不确定这是否真的正确,或者我的逻辑是否有缺陷?
  • 我相信s.Receive 会返回您收到的请求的长度。所以15 是接收到的字节数。
  • @zerkms 所以我现在已经成功地返回了Bytes 并收到了以下十六进制: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 发布。
  • 现在您需要再次检查我最初的建议:"0xFF 0xFC 0x18 0xFF 0xFD 0x20 0xFF 0xFC 0x23 0xFF 0xFD 0x27 0xFF 0xFC 0x24 \n" 这不是您创建字节数组的方式。只需检查Bytes1 并查看它是垃圾。 stackoverflow.com/a/6150310/251311 - 这将是另一个提示。

标签: c# telnet handshake


【解决方案1】:

所以我认为我在这里有两个核心问题:

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);

【讨论】:

    猜你喜欢
    • 2015-06-01
    • 2016-05-02
    • 1970-01-01
    • 2019-10-05
    • 1970-01-01
    • 1970-01-01
    • 2021-07-31
    • 2017-12-04
    • 2012-07-28
    相关资源
    最近更新 更多