現象為客戶端連線服務端,服務端日誌返回寫socket成功,但是客戶端報錯「read socket error」
把能調的超時時間都調大了,但是還是報錯
抓包結果服務端:
抓包結果客戶端:
分析原因:
1、可以看到客戶端是傳送完請求後,收到rst指令,導致連線斷開
客戶端新增日誌列印errno
if(num == 0)
htlog (gslogfile, ht_log_mode_normal, __file__,__line__, "num[%d]", num); /*[*1*] modify error -> normal*/
ireadlen+=num;
if(ireadlen>=len) break;
if( vnrd*** ) break;
}
結果為104:
errno: 104 connection reset by peer
2、經過排查**
int setsokopt(int sdnew)
sokeepalive = 0;
if( -1 == setsockopt(sdnew,
sol_socket,
so_keepalive,
&sokeepalive,
(int)sizeof(sokeepalive)))
soreuseaddr = 1;
if( -1 == setsockopt(sdnew,
sol_socket,
so_reuseaddr,
&soreuseaddr,
(int)sizeof(soreuseaddr)))
return 0;
}
**中設定了linger,並且solinger.l_linger = 0;
3、查詢得知「在設定so_linger選項時,指定等待時間為0,此時呼叫主動關閉時不會傳送fin來結束連線,而是直接將連線設定為close狀態,清除套接字中的傳送和接收緩衝區,直接對對端傳送rst包。」
4、將l_linger改為1就可以了
5、正常tcp握手是返回fin,但是由於設定了solinger,返回了rst。和網路延遲有關係,就是說服務端發了兩個包,乙個是資料報,乙個是rst包,但是客戶端總是先收到rst包導致接收資料失敗
6、參考資料:
在TCP傳輸中,什麼時候會收到RST報文段?
rst即復位字段。1.連線請求到達時,目的埠不存在。2.向乙個已經關閉的連線傳送資料。3.向乙個已經崩潰的對端傳送資料。4.請求超時。接收端在接收資料超時時,會傳送rst包。5.關閉socket時,直接丟棄接收緩衝區未讀取的資料,並給對方發乙個rst。6.tcp收到了乙個根本不存在的連線上的報文。7...
socket通訊程式設計
1 socket通訊模型如下 應用程式通過套接字可以進行通訊,可以使用udp協議或者使用tcp協議,當客戶端和伺服器端的協議時相對應的,客戶端使用tcp,那麼伺服器端使用tcp 2 udp協議 把資料打包成資料報,然後直接傳送對應的ip位址,速度快,但是不保證 成功率,並且資料大小有限 tcp協議 ...
Socket通訊基礎
socket通訊傳遞資料 服務端 using system.net using system.net.sockets using system.text using system.threading thread mythread socket socket 清理所有正在使用的資源。protecte...