標籤:
Software caused connection abort: recv failed
資料庫連接時有時會報此錯誤。用戶端建立短串連後,服務端關閉了串連,但是用戶端沒有關閉,仍然嘗試發送請求,就會發生錯誤。
描述如下:
用戶端和服務端建立tcp的短串連,每次用戶端發送一次請求, 服務端響應後關閉與用戶端的串連. 如果用戶端在服務端關閉串連後,沒有釋放串連,繼續試圖發送請求和接收響應. 這個時候就會出錯.
這個時候用戶端Socket的getOutputStream返回來的OutPutStream維護 的是本地的串連狀態, 無法知道遠端服務端已經關閉了對應的InputStream和socket因此 雖然調用了 out.write(sendbuf, 0, sendbuf.length); 方法,但是實際上服務端並沒有接收到用戶端的請求資訊. 因為沒有拋出異常,因此造成了誤以為用戶端請求發送成功的假象.
接下來調用etInputStream的in.read(header, 0, 14);方法. 因為這次要讀取服務端的資訊,因此產生了 Software caused connection abort: recv failed的異常
總結產生原因,在服務端/用戶端單方面關閉串連的情況下,另一方依然以為 tcp串連仍然建立,試圖讀取對方的響應資料,導致出現 Software caused connection abort: recv failed的異常.
因此在receive資料之前,要先判斷串連狀態. 通過inputstream的available()方法來判斷,是否有響應結果. 如果available()的傳回值為0,說明沒有響應資料,可能是對方已經中斷連線, 如果available()的傳回值大於0,說明有響應資料. 另外值得注意的是available()返回的值是非堵塞的,可以被多個線程訪問
在對方釋放串連後,也要釋放本地的串連.
還有一種可能是傳輸資料協議不一致,也可能會報這個錯誤。
Software caused connection abort: recv failed