端口检查工具在TcpClient服务器上导致无限的数据包接收循环
本文关键字:无限 数据包 循环 检查 工具 服务器 TcpClient | 更新日期: 2023-09-27 18:08:06
我编写了一个相对基本的异步服务器,它启动一个任务来接受客户端,然后每个客户端启动一个任务来接受传入的数据包,其代码如下:
MessageListeningTask = new Task(async () => {
while (true) {
byte[] buffer = new byte[256];
try {
await tcpClient.GetStream().ReadAsync(buffer, 0, buffer.Length);
} catch {
break;
}
string data = Encoding.UTF8.GetString(buffer).Trim(''0', ''n', ''r', ''t', ' ');
OnMessageReceived(data);
}
});
这似乎对大多数事情都很有效,并且在通过一个类路由它之后,在开始时基于令牌拆分令牌,这是一个相当有效的侦听器。
除了,考虑到我对这个主题的天真,我似乎在我的实现中做了一些愚蠢的事情,并用这个工具检查:http://www.yougetsignal.com/tools/open-ports/似乎打破了这个循环,并导致它触发onmessagerreceived不断没有数据。
我不完全确定采取什么程序来帮助诊断这个问题,并认为这可能与信息流的运作方式有关,所以我希望在这个话题上有经验的人可以帮助我解决我的问题,但也解释是什么导致了它。如果它是相关的,它在Ubuntu的Mono下运行,但它通常运行得很好,所以我不认为这是问题。
我很乐意提供任何额外的信息,或检查任何东西。
谢谢!
来自ReadAsync的文档:
https://msdn.microsoft.com/en-us/library/hh137813 (v = vs.110) . aspx
"返回值类型:System.Threading.Tasks.Task表示异步读操作的任务。result参数的值包含读入缓冲区的总字节数。如果当前可用的字节数少于请求的字节数,则结果值可以小于请求的字节数,如果已到达流的结尾,则结果值可以为0(零)。"
在循环中,ReadAsync必须不断返回0,因为它到达了流的末尾。