端口检查工具在TcpClient服务器上导致无限数据包接收循环

时间:2015-08-16 18:32:05

标签: c# tcp mono network-programming tcpclient

我编写了一个相对基本的异步服务器,它启动一个接受客户端的任务,然后每个客户端启动一个任务来接受传入的数据包,其代码如下:

        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/似乎打破了这个循环并导致它不断地触发OnMessageReceived而没有数据

我不完全确定要采取哪些程序来帮助诊断这个问题,并认为这可能与信息流如何运作有关,所以我希望有这方面经验的人可以帮助我解决我的问题但是还解释了导致它的原因。如果它是相关的,它在Ubuntu上的Mono下运行,但它通常运行完美,所以我看不出这是问题。

我很乐意提供任何其他信息,或查看任何内容。

谢谢!

1 个答案:

答案 0 :(得分:1)

来自ReadAsync的文档:

https://msdn.microsoft.com/en-us/library/hh137813(v=vs.110).aspx

“返回值 键入:System.Threading.Tasks.Task 表示异步读取操作的任务。 TResult参数的值包含读入缓冲区的总字节数。如果当前可用的字节数小于请求的数字,则结果值可以小于请求的字节数,如果已到达流的末尾,则结果值可以为0(零)。“

在循环中,ReadAsync必须不断返回0,因为它已到达流的末尾。