【问题标题】:c# TcpClient can not read valid response from successfully connected telnet server / devicec# TcpClient 无法从成功连接的 telnet 服务器/设备读取有效响应
【发布时间】:2010-12-13 16:36:47
【问题描述】:

目前我正在处理一个网络项目,其中包括连接到 tcp 服务器和一些设备。很长一段时间以来,我成功地使用下面的代码来发送 tcp 命令并接收某些设备型号的响应,但是当我在 Windows Telnet Server 2003 和 Fortigate 设备上尝试它时,即使我可以成功建立 tcp 连接,我也能得到所有响应是一些像??%??????'????的字符集。

我接收响应的函数是:

   private string receive()
    {
        StringBuilder sbReadBuffer = new StringBuilder();
        bool isFinished = false;
        NetworkStream ns = tcpClient.GetStream();
        DateTime lastConTime = DateTime.Now;

        while (!isFinished)
        {
            if (!ns.DataAvailable)
            {
                Thread.Sleep(200);

                if ((DateTime.Now - lastConTime).TotalSeconds > Prms.tcpSendReceiveTimeoutInSeconds)
                    break;
                else
                    continue;
            }

            Int32 receiveCount = ns.Read(receiveBuffer, 0, receiveBuffer.Length);
            String received = new ASCIIEncoding().GetString(receiveBuffer, 0, receiveCount);

            sbReadBuffer.Append(received);

            foreach (String terminaterToken in terminaterTokens)
                if (sbReadBuffer.ToString().EndsWith(terminaterToken))
                    isFinished = true;

            lastConTime = DateTime.Now;
        }

        return sbReadBuffer.ToString();
    }
}

以及用于建立 tcp 连接和调用接收函数:

        TcpClient tcpClient = new TcpClient()
    {
        SendTimeout = 10000,
        ReceiveTimeout = 10000
    };

    tcpClient.Connect(wanIp, 23);
    String initialMessage = receive();

我测试了设备收到的消息,上面的代码没有问题,我意识到对于每个不同的设备型号,初始响应总是类似于“??%??????'????”但随后是逻辑响应,例如“欢迎”与

在我的测试过程中,我发现程序成功连接到服务器/设备,但无法接收有效响应,我不知道这是为什么。有什么想法吗?

【问题讨论】:

    标签: c# response tcpclient


    【解决方案1】:

    导致“??%??”的问题符号是因为 telnet 选项 IAC。返回响应值,因为 IAC 的十进制代码大于 255。有关 IAC 的更多信息可以从地址获得

    support.microsoft.com/kb/231866

    IAC 值的问题在于,当您尝试使用标准代码使用 C# tcpClient 解析响应时

                byte[] sendBuffer = new ASCIIEncoding().GetBytes(str + strNewLine);
                tcpClient.GetStream().Write(sendBuffer, 0, sendBuffer.Length);
    

    当收到 IAC 值时,代码会生成上述“??%”值。

    为了防止这种情况并处理 IAC 值,我做了一些研究,并在地址 http://www.codeproject.com/KB/IP/TelnetSocket.aspx 上找到了一个出色的 telnet 项目,它完美地处理了 IAC 值。

    为了更好地理解处理 IAC 值,检查 MinimalisticTelnet 库的源代码也会很有用。我能够使用 MinimalisticTelnet 毫无问题地获得响应,但它无法为我工作的设备发送消息,所以我更喜欢 telnet 套接字项目。但我强烈建议学习 MinimalisticTelnet 源代码以便更好地理解。

    【讨论】:

      猜你喜欢
      • 2018-07-10
      • 1970-01-01
      • 1970-01-01
      • 2014-06-28
      • 2011-09-18
      • 2012-12-07
      • 1970-01-01
      • 1970-01-01
      • 2012-03-30
      相关资源
      最近更新 更多