避免在套接字读取中使用Thread.Sleep()

时间:2010-03-26 19:12:17

标签: .net sockets

我正在编写一个usenet新闻阅读器,并调用XOVER id-消息来获取组中的所有文章。

如果我使用此代码,我只获得响应的前5kB:

        while((read = _networkStream.Read(buffer, 0, 5000)) > 0)
        {
            ret += Encoding.ASCII.GetString(buffer, 0, read);
            if(read < 5000)
                break;

        }

但如果我将Thread.Sleep(100);添加到循环中,我会得到整个列表。

我可以这样做吗?

2 个答案:

答案 0 :(得分:3)

在没有获得完整缓冲区后,read < 5000的检查会立即突破循环。完全没有保证你得到一个完整缓冲区的数据,所以你根本不应该有那个部分。只需将read中的> 0检查保持在while条件下即可正常工作,因为返回的值为正数是已成功读取的已定义指示。

当你包含sleep时,它的工作原理是,通过休眠,你可以让底层的输入数据缓冲区填满,以便在下一轮中有足够的数据用于完整的缓冲区。

由于NNTP连接用于多个命令,因此您需要识别应用程序级别的数据终止;套接字函数对你没有帮助,因为他们不会理解NNTP如何划分消息。 XOVER命令的规范说“一旦输出完成,就会在一行上发送一段时间。”所以你需要解析你的循环中的响应(因为NNTP是面向行的,所以将它拆分成行),当你在一行上遇到一个句点时,就会突破循环。

答案 1 :(得分:0)

为什么在读取时断开&lt; 5000?你绝对应该在读取&lt; = 0时断开。对不起,没注意到Read(buffer,0,5000))&gt; 0