如何以编程方式处理telnet连接的延迟?

时间:2009-03-30 14:12:13

标签: c# telnet latency tcpclient lag

我利用TcpClient类实现telnet连接。我不知道的是如何确定响应的结束。似乎一旦DataAvailable属性为true,我从Stream读取数据,然后DataAvailable暂时设置为false,而缓冲区正在填充另一块数据,但我认为这些都被读取并消失。如何确保读取所有响应?

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

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

3 个答案:

答案 0 :(得分:2)

对于像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"));       

答案 1 :(得分:0)

我不认为将DataAvailable用于此目的是个好主意。您的回复结束是您的协议所说的。

最好使用像Read这样的阻塞调用来阅读你的东西,并使用你建立的任何协议来确定阅读更多,以及多少。可能不会返回您想要的所有数据,因为Read在读取所有数据时不会返回,但是当读取某些数据时,您需要检查读取的数据。

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

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

答案 2 :(得分:0)

这是一个真正的telnet连接,即你是连接到telnet服务器还是'telnet'你真的是指'TCP / IP套接字'吗?

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