2012-08-01 47 views
7

我正在處理客戶端連接TCP連接的應用程序,然後觸發大量可能需要大量時間才能完成的工作。如果用戶丟棄TCP連接,則必須取消該工作。正在向網絡流寫入零字節是檢測關閉連接的可靠方法嗎?

目前,我在做什麼正在啓動一個計時器,定期檢查網絡,做這個流的連接:

// stream is a Stream instance 
var abort = false; 
using (new Timer(x => { 
    try 
    { 
     stream.Write(new byte[0], 0, 0); 
    } 
    catch (Exception) 
    { 
     abort = true; 
    } 
}, null, 1000, 1000)) 
{ 
    // Do expensive work here and check abort periodically 
} 

我也喜歡閱讀CanWriteCanReadConnected但他們報告流的最後狀態。寫零字節是測​​試連接性的可靠方法,還是這可能會導致問題?我無法在流上寫入或讀取任何實際數據,因爲這會弄亂客戶端。

回答

3

我們只是說,我已經知道它在幾十年前的工作,但沒有內在原因,爲什麼它應該。你和TCP堆棧之間的任何API層都有權阻止對下一層的調用,即使它一路進入堆棧,它只會在以下情況下返回錯誤:

  1. 它檢查在檢查零長度之前發現網絡錯誤,這是依賴於實現的,並且
  2. 以前的一些操作或傳入的RST導致網絡錯誤。

如果您希望它神奇地探測網絡到另一端,它肯定不會。

+0

它似乎爲我工作,但我可以看到你的觀點。我並不期望它能夠一路探測,但是如果它有一點點的話,它可能會足夠好。某處必須有某種本地標誌,表示是否存在重置連接?事件或其他事情會非常好。 – Dervall 2012-08-01 09:17:25

+0

@Dervall堆棧知道是否有重置,但我從來沒有見過我的生活中會給你的TCP API。您必須在TCP連接上執行I/O才能獲得錯誤。它的確如此設計:'無撥號音'。構建用於承受中間節點故障和重新路由。 – EJP 2012-08-01 09:22:46