Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何以编程方式处理telnet连接上的延迟?_C#_Telnet_Latency_Tcpclient_Lag - Fatal编程技术网

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

C# 如何以编程方式处理telnet连接上的延迟?,c#,telnet,latency,tcpclient,lag,C#,Telnet,Latency,Tcpclient,Lag,我利用TcpClient类实现telnet连接。我不知道的是如何确定响应的结束。看起来,一旦DataAvailable属性为true,我就从流中读取数据,然后DataAvailable被临时设置为false,而缓冲区正在被另一块数据填充,但我认为所有数据都已读取并消失。我如何确保所有响应都已阅读 您可能会建议我如何更改下面的代码段以使其正确工作。当我逐步阅读代码时,它工作正常,因为有足够的时间检索整个响应。谢谢你的帮助 if (this.Stream.DataAvailable) { r

我利用TcpClient类实现telnet连接。我不知道的是如何确定响应的结束。看起来,一旦DataAvailable属性为true,我就从流中读取数据,然后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;
}

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

我认为将可用数据用于此目的不是一个好主意。不管你的协议怎么说,你的回应就到此为止

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

如果您的协议是Telnet,那么您可能希望对接收到的每个字节做出响应,就像您希望回显或处理命令之类的终端一样


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

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


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

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