2017-06-01 87 views
1

當從NetworkStream接收數據時,我可以配置stream.ReadTimeout
當在配置的時間內沒有收到任何數據時,我得到一個SocketExceptionex.SocketErrorCode=SocketError.TimedOut由於超時而導致異常後可以繼續使用NetworkStream嗎?

我可以在這個異常之後繼續使用流,還是有可能以這種方式丟失一些字節?

示例代碼:

using (TcpClient client = new TcpClient("127.0.0.1", 2000)) 
using (NetworkStream stream = client.GetStream()) 
using (StreamReader reader = new StreamReader(stream, Encoding.ASCII)) 
{ 
    stream.ReadTimeout = 5000; 

    while (true) 
    { 
     int i; 
     try 
     { 
      i = reader.Read(); 
     } 
     catch (IOException ex) 
     { 
      SocketError socketError = SocketError.Success; 
      if (ex.InnerException is SocketException) 
       socketError = ((SocketException)ex.InnerException).SocketErrorCode; 

      if (socketError == SocketError.TimedOut) 
      { 
       Console.WriteLine("no data received for 5 seconds"); 
       continue; 
      } 
      else throw; 
     } 
    } 
} 
+0

[Click](https://stackoverflow.com/a/3575154/1997232)。 – Sinatr

+0

@Sinatr我不認爲你連接的答案是正確的。在我的測試中,TcpClient根本不會斷開,它工作得很好。我只是不知道這種方法是否安全,或者字節是否可能會丟失。 – HugoRune

回答

2

我沒有發現這對.NET方面的任何文件,但NetworkStream.ReadTimeout用途(在Windows上)setsockopt原生功能,在此功能的描述和它的各種選擇它(在SO_RCVTIMEOSO_SNDTIMEO錯誤代碼的描述)被明確提出:

如果發送或接收操作超時的插座上,插座狀態 是不確定的,並且不應該 用過的;處於此狀態的TCP套接字 有可能會丟失數據,因爲在完成操作的同一時刻可能會取消該操作 。

相關問題