socket通訊收到rst指令問題

2021-09-11 21:55:28 字數 1413 閱讀 3175

現象為客戶端連線服務端,服務端日誌返回寫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...