2016-03-02 27 views
0

我有以下代碼從time.nist.gov讀取時間:C#StreamReader的ReadToEnd的凍結

TcpClient client = new TcpClient(); 
var result = client.BeginConnect("129.6.15.28", 13, null, null); 
var success = result.AsyncWaitHandle.WaitOne(TimeSpan.FromSeconds(1)); 
if (!success || !client.Connected) 
      // Timeout 
else{ 
     streamReader = new StreamReader(client.GetStream()); 
     var response = streamReader.ReadToEnd(); 
     //code 
} 

的問題是,有時ReadToEnd的獲得無限期冷凍,我想是因爲它沒有達到和結束。

是否可以設置此操作的超時時間?

或者更好的選擇來讀取服務器響應?

謝謝。

+1

使用端口13(白天協議)是一個壞主意。它沒有確定迴應的格式,所以你不知道什麼時候得到完整回覆。當服務器沒有斷開連接時沒有結束。該協議僅適用於終端,人力等待。至少使用NTP,也許你不應該自己寫。已完成。 –

+0

港口13鬧鬼。 – usr

回答

2

根據MSDN

ReadToEnd的假設,當它已經到頭流知道。對於服務器只在需要時才發送數據並且不關閉連接的交互式協議,ReadToEnd可能會無限期地阻塞,因爲它沒有達到結束,應該避免。

你知道你有多讀嗎?如果是這樣,你可以使用Read()

編輯:

我測試此代碼(很好,非常類似的東西),發現ReadToEnd工作正常,除非端口13被阻止,在這種情況下,它也運行,而無需返回,我也是如此。所以,在做這件事之前檢查你的防火牆。

漢斯的建議是使用現有的經過良好測試的NTP庫。