如何在 C# 程序中打开 Telnet 会话并以编程方式发送命令和接收响应?

Posted

技术标签:

【中文标题】如何在 C# 程序中打开 Telnet 会话并以编程方式发送命令和接收响应?【英文标题】:How to open a Telnet session in C# program and send commands and receive responses programmatically? 【发布时间】:2021-10-18 21:34:03 【问题描述】:

我有一台 optoma 投影仪,我想从 C# 程序内部使用 Telnet 会话与其通信。使用各种包装器和 Nuget 包,我能够启动 telnet 会话,但我无法在我的 C# 程序中传达命令或接收响应。

在普通的 windows cmd 中,如果我写 Telnet 192.168.222.127,telnet 会话就会开始。投影机以 ASCII 格式 (https://www.optoma.de/uploads/RS232/DS309-RS232-en.pdf) 响应命令,并根据命令失败或通过返回“F”或“P”。要将亮度更改为 10,我会这样做:

    打开 Telnet 连接:telnet 192.168.222.127 发送命令将亮度更改为 10 : ~0021 10 在更改亮度的命令中,会话将以“P”响应。 Telnet Terminal Commands

我想对 C# 程序做同样的事情,但我被卡住了。大多数答案都指向过时的包和链接。我是 Telnet 和通信协议的新手,需要这方面的帮助。谢谢。

【问题讨论】:

只需使用Telnet library。 或者,如果您喜欢冒险,就每天使用香草Tim Shaw Demtel 插座 ***.com/questions/390188/c-sharp-telnet-library - 有一些 lib 建议(SO 的主题外)和至少一个答案,其中包含一些用于戳 telnet 服务器的粗略代码 我尝试了不同的 telnet 库,通过所有这些库,我都能够连接到投影仪。问题是我将 ascii 命令作为“~0000 1\n”发送。一旦我将其更改为“~0000 1\r\n”,投影仪就可以理解命令。这可能是一件显而易见的事情,但直到我尝试过才知道。 【参考方案1】:

如果你只是想连接设备,发送命令并读取响应,简单的 C# TcpClient 就足够了。它为 TCP 网络服务提供客户端连接,这正好适合我的情况。

用于建立连接:

using system.net.sockets;

    public void EstablishConnection(string ip_address, int port_number=23)
        try
        
            client = new TcpClient(ip_address, port_number);
            if (DEBUG) Console.WriteLine("[Communication] : [EstablishConnection] : Success connecting to : 0, port: 1", ip_address, port_number);
            stream = client.GetStream();
        
        catch
        
            Console.WriteLine("[Communication] : [EstablishConnection] : Failed while connecting to : 0, port: 1", ip_address, port_number);
            System.Environment.Exit(1);
        
    

用于发送和接收响应:

    public string SendMessage(string command)
    
        // Send command
        Byte[] data = System.Text.Encoding.ASCII.GetBytes(command);
        stream.Write(data, 0, data.Length);
        if (DEBUG) Console.Write("Sent : 0", command);

        WaitShort();

        // Receive response
        string response = ReadMessage();
        if (DEBUG) Console.WriteLine("Received : 0", response);

        return response;
    

    public string ReadMessage()
    
        // Receive response
        Byte[] responseData = new byte[256];
        Int32 numberOfBytesRead = stream.Read(responseData, 0, responseData.Length);
        string response = System.Text.Encoding.ASCII.GetString(responseData, 0, numberOfBytesRead);
        response = ParseData(response);
        if (response == "SEND_COMMAND_AGAIN")
        
            if (DEBUG) Console.WriteLine("[ReadMessage] : Error Retreiving data. Send command again.");
        
        return response;
    

您可以根据自己的要求解析来自服务器的响应。

【讨论】:

以上是关于如何在 C# 程序中打开 Telnet 会话并以编程方式发送命令和接收响应?的主要内容,如果未能解决你的问题,请参考以下文章

使用Python 2.7打开用户指定的文件以在Telnet会话中使用

如何打开 2+ 个 VLC 实例并以编程方式控制它们?

如何检查 Net::Telnet 会话是不是仍在 Perl 中?

MobaXterm telnet手动连接PNET Lab中的设备

从 Windows cmd 向 telnet 会话日志的每一行添加时间戳

如何在 telnet 会话期间迭代队列? [复制]