connection reset by peer的常見原因
1.服務器的並發連接數超過了其承載量,服務器會將其中一些連接關閉;
2. errno = 104錯誤表明你在對一個對端socket已經關閉的的連接調用write或send方法,在這種情況下,調用write或send方法后,對端socket便會向本端socket發送一個RESET信號,在此之后如果繼續執行write或send操作,就會得到errno為104,錯誤描述為connection reset by peer。
具體的分析可以結合TCP的"四次揮手"關閉. TCP是全雙工的信道, 可以看作兩條單工信道, TCP連接兩端的兩個端點各負責一條. 當對端調用close時, 雖然本意是關閉整個兩條信道, 但本端只是收到FIN包. 按照TCP協議的語義, 表示對端只是關閉了其所負責的那一條單工信道, 仍然可以繼續接收數據. 也就是說, 因為TCP協議的限制, 一個端點無法獲知對端的socket是調用了close還是shutdown.
對於一個TCP連接,如果對端執行close操作,則會向本端發送一個FIN分節,這時候讀本端socket會返回0,我們就知道對方已經關閉了連接,通常這時候我們會在本地調用close來主動關閉本端連接。但如果對方socket已經執行了close的操作,本端socket還繼續在這個連接上寫數據,就會觸發對端socket發送RST報文,按照TCP的四次揮手原理,這時候本端socket應該也要開始執行close的操作流程了,而不是接着發數據.