我正在编写一个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);
添加到循环中,我会得到整个列表。
我可以这样做吗?
答案 0 :(得分:3)
在没有获得完整缓冲区后,read < 5000
的检查会立即突破循环。完全没有保证你得到一个完整缓冲区的数据,所以你根本不应该有那个部分。只需将read
中的> 0
检查保持在while
条件下即可正常工作,因为返回的值为正数是已成功读取的已定义指示。
当你包含sleep
时,它的工作原理是,通过休眠,你可以让底层的输入数据缓冲区填满,以便在下一轮中有足够的数据用于完整的缓冲区。
由于NNTP连接用于多个命令,因此您需要识别应用程序级别的数据终止;套接字函数对你没有帮助,因为他们不会理解NNTP如何划分消息。 XOVER
命令的规范说“一旦输出完成,就会在一行上发送一段时间。”所以你需要解析你的循环中的响应(因为NNTP是面向行的,所以将它拆分成行),当你在一行上遇到一个句点时,就会突破循环。
答案 1 :(得分:0)
为什么在读取时断开&lt; 5000?你绝对应该在读取&lt; = 0时断开。对不起,没注意到Read(buffer,0,5000))&gt; 0