端口检查工具导致 TcpClient 服务器上的无限数据包接收循环
Port checking tool causes infinite packet received loop on TcpClient server
我写了一个比较基础的异步服务器,启动一个任务接受客户端,然后每个客户端启动一个任务接受传入的数据包,代码如下:
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('[=10=]', '\n', '\r', '\t', ' ');
OnMessageReceived(data);
}
});
这似乎对大多数事情都非常有效,并且在通过 class 将其路由到开始时根据令牌拆分令牌之后,它是一个非常有效的侦听器。
除了,鉴于我对这个话题的天真,我似乎在我的实现中的某个地方做了一些愚蠢的事情,并使用这个工具检查:http://www.yougetsignal.com/tools/open-ports/ 似乎打破了这个循环并导致它不断触发 OnMessageReceived没有数据。
我不完全确定要采取什么程序来帮助诊断这个问题,我想这可能与信息流的运作方式有关,所以我希望有这方面经验的人可以帮助我解决我的问题问题,但也要解释是什么原因造成的。如果相关,它是 Ubuntu 上 Mono 下的 运行,但它通常运行完美,所以我看不出这是问题所在。
我很乐意提供任何其他信息,或检查任何内容。
谢谢!
来自 ReadAsync 的文档:
https://msdn.microsoft.com/en-us/library/hh137813(v=vs.110).aspx
"Return 值
类型:System.Threading.Tasks.Task
表示异步读取操作的任务。 TResult 参数的值包含读入缓冲区的字节总数。如果当前可用的字节数小于请求的数量,则结果值可能小于请求的字节数,或者如果已到达流的末尾,则结果值可以为 0(零)。"
在循环中,ReadAsync 必须不断返回 0,因为它已到达流的末尾。
我写了一个比较基础的异步服务器,启动一个任务接受客户端,然后每个客户端启动一个任务接受传入的数据包,代码如下:
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('[=10=]', '\n', '\r', '\t', ' ');
OnMessageReceived(data);
}
});
这似乎对大多数事情都非常有效,并且在通过 class 将其路由到开始时根据令牌拆分令牌之后,它是一个非常有效的侦听器。
除了,鉴于我对这个话题的天真,我似乎在我的实现中的某个地方做了一些愚蠢的事情,并使用这个工具检查:http://www.yougetsignal.com/tools/open-ports/ 似乎打破了这个循环并导致它不断触发 OnMessageReceived没有数据。
我不完全确定要采取什么程序来帮助诊断这个问题,我想这可能与信息流的运作方式有关,所以我希望有这方面经验的人可以帮助我解决我的问题问题,但也要解释是什么原因造成的。如果相关,它是 Ubuntu 上 Mono 下的 运行,但它通常运行完美,所以我看不出这是问题所在。
我很乐意提供任何其他信息,或检查任何内容。
谢谢!
来自 ReadAsync 的文档:
https://msdn.microsoft.com/en-us/library/hh137813(v=vs.110).aspx
"Return 值 类型:System.Threading.Tasks.Task 表示异步读取操作的任务。 TResult 参数的值包含读入缓冲区的字节总数。如果当前可用的字节数小于请求的数量,则结果值可能小于请求的字节数,或者如果已到达流的末尾,则结果值可以为 0(零)。"
在循环中,ReadAsync 必须不断返回 0,因为它已到达流的末尾。