2015-04-27 38 views
2

我有這個問題。我的套接字連接中斷,找不到路由原因。套接字復位的原因是什麼

有2臺服務器。這些是在不同國家的2臺電腦。第一個運行等待通過套接字連接的Java程序。第二臺服務器運行連接到Java服務器的C++程序,並在一個端口上打開多個套接字。接下來的服務器通過這些套接字通過UTF字符串交換。

問題是有時套接字連接中斷。這不是一個網絡或電纜拔掉的問題,因爲2個插座可以中斷,但其餘8個正常工作。這兩個服務器的問題看起來是一樣的。每個服務器都有一個調用阻塞read()方法的線程,並且這兩種方法一次都會引發異常。 Java服務器引發以下:

java.net.SocketException異常:連接在java.net.SocketInputStream.read(來源不明) 在java.net.SocketInputStream.read(來源不明) 復位 在java中。 net.SocketInputStream.read(未知來源) 在java.io.DataInputStream.readUnsignedShort(未知來源) 在java.io.DataInputStream.readUTF(未知來源) 在java.io.DataInputStream.readUTF(未知來源)

而C++服務器會拋出以下錯誤:

錯誤10054(由對等方重置連接。 甲現有連接被強行關閉遠程主機。)發生接收數據 ERROR中的CSocket ::接收(),199線

所有明顯假設像「的服務器中的一個關閉套接字」和'其中一臺服務器發送了無限量的數據「已被檢查。沒有發現問題的原因。服務器可以正常工作1小時,然後5個插座可以在5分鐘內中斷,下一個0.5小時一切正常,下一個插座中斷等。

請指教從哪裏可以找到問題路由原因。謝謝。

+0

使用調試器,拋出異常時中斷,檢查變量並逐步掃描痕跡以縮小範圍。 –

+1

也許你可以找到一個理由,我們不能,因爲沒有代碼顯示。但另一方面:即使代碼是完美的,有時也會發生,所以您需要找到一種方法來處理這個問題。 – alain

+0

過去只是在StackOverflow上查找類似的問題。錯誤10054是Windows在您的Java服務器上強行關閉其連接的barfing,您已經知道該連接。但從我讀到的內容來看,您可能想要檢查您是否正確地將所有數據從流中提取出來,trace中的readUnsignedShort。環顧四周。 – jiveturkey

回答

0

當遠程連接因應用程序崩潰,系統重啓,遠程主機硬關閉等各種原因而意外強制關閉時。來自遠程系統的內核將帶有RST位的數據包發送到本地系統。執行任何SEND(可能是Keep-alive數據包)或RECEIVE操作的本地套接字隨後會因此錯誤而失敗。延遲設置的某些組合也可能導致RST位被設置的數據包。

相關問題