2011-08-09 31 views
2

問題Java Socket技術得到例外

在桌面網絡應用程序後無法使用在發送數據的DatagramSocket有時exceptiption發生:

java.net.SocketException: No buffer space available (maximum connections reached?): Datagram send failed 

後這個異常插座是完全不可用的:它不收到任何東西,併發送()無限期掛起。重現測試是一個簡單的應用程序(創建套接字,綁定,而(真正的)發送();)

我只能在機器進入睡眠模式,然後回來時在Windows上100%的情況下重複此行爲處於「密集數據流」的中間。

的問題是

  1. 是這種行爲正常的BSD套接字 - 錯誤後能得到無法使用?或者它是一種WSA錯誤?
  2. 有什麼辦法可以將錯誤的套接字「重置」到工作狀態或重新打開套接字是唯一的解決方案嗎?
  3. 是否有可能在捕獲異常後將這些條件與常規I/O錯誤(即可恢復錯誤)區分開來?
  4. 是否有任何一般性指導/就當我重新打開應用插座建議(我的意思是:網絡地址改變,PC休眠/喚醒和其他活動)

謝謝! :)

+0

我已經在9月份重複了這個測試,並且...... heh ..異常仍然發生,但它不會使套接字不再可用。即它可以被忽略並且套接字上的通信可以繼續。我在這期間發現了我的Win7中的幾個大的更新,所以可能MS的人已經修復了WSA中的一些東西... – tuxSlayer

回答

1

套接字在發生任何異常後都不可用,但SocketTimeoutException異常。

+0

也有PortUnreachableException,我現在無法檢查,但也認爲它也會被拋出用於UDP套接字,文檔說:「信號表明在連接的數據報上收到了ICMP端口無法訪問的消息.'但是,我沒有知道「連接的數據報」是什麼('套接字'字缺失?)... – tuxSlayer

+0

@ tuxSlayer正確,謝謝。發生PortUnreachableException後,停止發送到該地址將是明智的做法,並且您可以斷開套接字並將其用於發送到其他地址。 – EJP

1

我認爲這是安全的假設套接字不再可用,如果讀取或寫入套接字導致引發異常。在這種情況下你會期望什麼樣的可恢復的I/O錯誤?

+0

我想在發送UDP數據報的時候某種「端口無法訪問」的ICMP消息可能觸發一個例外... ? :) – tuxSlayer

+0

不,我不會期望這一點。如果發送UDP數據報,如果接收到數據包,則既沒有確認,也沒有接收器地址不可達的錯誤報告。 – jarnbjo

+0

是啊,我知道比udp是不可靠的,但從一些主機/網絡我得到這個錯誤,雖然。用於本地代碼的BSD套接字API甚至爲這種情況定義了錯誤代碼(主機不可達,網絡不可達)...此外,可以在本地主機上檢測到錯誤情況(例如沒有到主機的路由)並且因此可以被報告。說實話,我不記得這些來自java套接字的錯誤,但在本地代碼中可以忽略這些錯誤或將它們處理爲可恢復的。 – tuxSlayer