【问题标题】:How to deal with delays on telnet connection programmatically?如何以编程方式处理 telnet 连接的延迟?
【发布时间】:2010-10-16 09:24:31
【问题描述】:

我利用 TcpClient 类来实现远程登录连接。我不知道的是如何确定响应的结束。似乎一旦 DataAvailable 属性为真,我从 Stream 中读取数据,然后 DataAvailable 在缓冲区被另一块数据填充时临时设置为假,但我认为已全部读取并消失。如何确保已阅读所有回复?

您可能会建议我如何更改下面的代码 sn-p 以使其正常工作。当我单步执行代码时它可以正常工作,因为有足够的时间来检索整个响应。感谢您的帮助。

if (this.Stream.DataAvailable)
{
    readBuffer = new Byte[this.Client.ReceiveBufferSize];
    do
    {
        // read data
        bytes = this.Stream.Read(readBuffer, 0, readBuffer.Length);
        Thread.Sleep(10);
        responseData = String.Concat(responseData, System.Text.Encoding.ASCII.GetString(readBuffer, 0, bytes));

       } while (this.Stream.DataAvailable);

       allDataRead = true;
       break;
}

【问题讨论】:

    标签: c# telnet latency tcpclient lag


    【解决方案1】:

    这是一个实际的 telnet 连接,即您是连接到 telnet 服务器还是“telnet”是指“TCP/IP 套接字”?

    首先判断服务器是否在传输完成时断开连接。如果是这样,您可以简单地阅读直到流结束。否则,如果没有,您将不得不在数据中使用提示来确定读取是否完成。在这方面,不同的协议以不同的方式工作,所以如果你能启发我们了解协议,我们可能会给出更直接的答案。方法通常分为两个阵营:包括在响应开始时的字节/字符计数(接收方简单地读取那么多字节/字符)或者使用标记来分隔响应的结尾(接收方读取直到接收到分隔符)。

    【讨论】:

    • 它是使用 tcp/ip 套接字和端口 23 连接到 telnet 服务器。服务器不会终止连接。 telnet 会话的第一部分是当服务器要求输入第一个用户名和密码时的身份验证。我会检查分隔符,稍后通知您。谢谢。
    • 假设 telnet 服务器是 Unix/BSD/Windows/etc 上的控制台会话。服务器,那么您可以使用命令提示符文本作为分隔符。
    【解决方案2】:

    我认为将 DataAvailable 用于此目的不是一个好主意。你的回应的结尾是你的协议所说的。

    最好使用 Read 之类的阻塞调用来读取您的内容,并使用您已建立的任何协议来确定读取更多内容和数量。可能不是你想要的所有数据都返回了,因为当你读取所有数据时,Read 不会返回,而是在读取一些数据时,所以你需要检查读取了多少。

    如果您的协议是 Telnet,您可能希望响应接收到的每一个字节,就像您想要回显它或处理命令或其他什么的终端一样。

    DataAvailable 可能适合检查调用时 Read 是否会阻塞(它将返回缓冲区中的任何内容),但它会使您的循环不那么简单。

    【讨论】:

      【解决方案3】:

      对于 Telnet 等应用程序的 TCP 连接,没有传输结束这样的概念。您经常会发现 telnet 客户端在用户输入它们时一次发送每个按键,并且由服务器决定何时采取行动,通常是在它收到换行符时。其他客户端可能会缓冲几次客户端按键并一次性发送。

      从您的应用程序的外观来看,您应该寻找用于指示传输结束的换行符。

      do    
      {      
           bytes = this.Stream.Read(readBuffer, 0, readBuffer.Length);             
           responseData = String.Concat(responseData, System.Text.Encoding.ASCII.GetString (readBuffer, 0, bytes));       
      } while (this.Stream.DataAvailable && !responseData.Contains("\n"));       
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多