2013-10-14 34 views
1

我已經與 DatagramChannel有些疑惑。當套接字被綁定並且接收方法在後臺以阻塞模式運行時,我剛剛做了一個拔掉電纜的快速測試。即使我寫入這個套接字,也沒有拋出異常。
再次插入電纜後,一切都看起來很好 - 插座仍然綁定。
試驗後提出了一些問題:

1)如果有必要重新綁定插座? (一些系統或網絡事件的場景)
2)網絡不可達時會拋出異常嗎? (當我寫這是不可達接口開往插座,將包中的高速緩存緩衝和等待界面將上升)
3)當套接字通道可通過系統關閉?處理不尋常的網絡事件

在此先感謝。你是否知道任何與這類話題有關的書(低級細節)?

回答

1

這在某種程度上是獨立的。當電纜斷開時,操作系統可能檢測到介質發生故障並使所有插座無效,但此處未發生此處。對於一個類似於UDP的協議,它甚至可能不是真正有效的。

即使在寫入此套接字時也沒有拋出異常。

即使您通過UDP寫入連接到黑洞的套接字,您也不在乎。只要發送緩衝區中有空間並且要發送的數據包有效(如大小,尋址),即使路由器被路由器損壞或丟失,也不會有錯誤。在這裏,它剛剛丟失,非常接近原點。

2)網絡無法訪問時會拋出異常嗎? (當我寫入一個綁定在無法訪問的接口上的套接字時,數據包將被緩存在緩存中並等待接口啓動)

一般來說,只是發送數據包而不考慮它在丟失之前會走多遠。

3)當用於套接字通道可以通過系統被關閉?

時,它不是一個無連接協議。如果這是TCP,你會發現缺少keepalive數據包和一般通信中斷,通道將被打破。

+1

一旦你打開一個連接,我相信它保持打開,直到你自己關閉它,儘管有一個斷開的電纜。路由器可能會嘗試重新發送它幾次,但它可能只是丟棄數據包。 – aglassman

+0

@aglassman如果電纜在機器上拔出,則不會有路由器,只有IP堆棧。 – hexafraction

0

1)如果有必要重新綁定插座? (某些情況下與系統或網絡事件)

你不能重新綁定一個插座。

2)網絡無法訪問時會拋出異常嗎?

你不會得到一個例外發送UDP數據報,除非套接字連接到目的地時,你可以得到「無法訪問」錯誤。

(當我寫這是不可達接口開往插座,將包在緩存中緩衝,等待界面將上升)

3)何時可以通過系統關閉套接字通道?

從來沒有。你必須自己關閉它。

您是否知道與此類主題(低級詳細信息)相關的任何書?

對於這種細節,你會去到Oracle,理查德·史蒂文斯,TCP/IP詳解,卷I和II。