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