2010-03-26 75 views
0

我正在編寫一個usenet新聞閱讀器,並調用XOVER id-消息來獲取組中的所有文章。避免在socket讀取中使用Thread.Sleep()

如果我使用此代碼,我只得到響應的前5KB:

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

     } 

但是,如果我添加Thread.Sleep(100);進入死循環,我得到的整個列表。

我能以另一種方式做到這一點嗎?

回答

3

read < 5000的檢查將在沒有獲得完整緩衝區後立即跳出循環。一點也不能保證你得到一個完整緩衝區的數據,所以你根本不應該有那個部分。只要保持在檢查readwhile條件是> 0和工作的事情正確,因爲其返回的值是正,是成功讀取的定義指示。

當你包含sleep時,它的工作原理是通過休眠讓底層的傳入數據緩衝區充滿足夠的空間,以便下一輪有足夠的數據用於完整的緩衝區。

而且由於NNTP連接用於多個命令,您將需要識別應用程序級別的數據終止;套接字函數不會幫助你,因爲他們不會理解NNTP如何分隔消息。 XOVER命令的規範說:「一旦輸出完成,一段時間就自行發送一行。」所以你需要分析你的循環內部的響應(將它分解成行,因爲NNTP是面向行的),並且當你自己在行上遇到一個句點時,就跳出循環。

+0

這是行不通的。字符串完整。當讀取數據的最後一個緩衝區時,它被卡在'_networkStream.Read(buffer,0,5000)'上。它永遠不會退出循環。 – ErikTJ 2010-03-26 19:35:26

+0

@Erik:對不起,我忽略了你在做NNTP。回答擴展到建議如何使用這種面向行的持久連接協議來做到這一點。 – JaakkoK 2010-03-26 19:45:41

+0

添加一個ret.EndsWith(「。\ r \ n」)解決了這個問題。 – ErikTJ 2010-03-26 19:46:56

0

爲什麼在閱讀時折斷< 5000?只有當閱讀< = 0時,你肯定應該打破。對不起,沒有注意到讀(緩衝區,0,5000))> 0.