struct linger
tcp連線斷開的時候呼叫
closesocket
函式,有優雅的斷開和強制斷開兩種方式
. 那麼如何設定斷開連線的方式呢?是通過設定
socket
描述符乙個
linger
結構體屬性。
linger
結構體資料結構如下:
struct linger
;有三種組合方式:
第一種l_onoff = 0;
l_linger
忽略 這種方式下,就是在
closesocket
的時候立刻返回,底層會將未傳送完的資料傳送完成後再釋放資源,也就
是優雅的退出。
第二種l_onoff
非零 l_linger = 0;
這種方式下,在呼叫
closesocket
的時候同樣會立刻返回,但不會傳送未傳送完成的資料,而是通過乙個
rest
包強制的關閉
socket
描述符,也就是強制的退出。
第三種l_onoff
非零 l_linger > 0
這種方式下,在呼叫
closesocket
的時候不會立刻返回,核心會延遲一段時間,這個時間就由
l_linger
得值來決定。如果超時時間到達之前,傳送完未傳送的資料(包括
fin包
)並得到另一端的確認,
closesocket
會返回正確,
socket
描述符優雅性退出。否則,
closesocket
會直接返回錯誤值,未傳送資料丟失,
socket
描述符被強制性退出。需要注意的時,如果
socket
描述符被設定為非堵塞型,則
closesocket
會直接返回值。
linux下需要包含標頭檔案
具體用法:
struct linger ling = ;
setsockopt(socketfd, sol_socket, so_linger, (void*)&ling, sizeof(ling));
原文
Tcp 斷開連線
tcp協議規定,對於已經建立的連線,網路雙方要進行四次握手才能成功斷開連線,如果缺少了其中某個步驟,將會使連線處於假死狀態,連線本身占用的資源不會被釋放。網路伺服器程式要同時管理大量連線,所以很有必要保證無用連線完全斷開,否則大量僵死的連線會浪費許多伺服器資源。在眾多tcp狀態中,最值得注意的狀態有...
TCP IP 斷開連線
tcp ip 斷開連線 四次握手 斷開連線其實從我的角度看不區分客戶端和伺服器端,任何一方都可以呼叫close or closesocket 之類 的函式開始主動終止乙個連線。這裡先暫時說正常情況。當呼叫close函式斷開乙個連線時,主動斷開的 一方傳送fin finish報文給對方。有了之前的經驗...
php斷開mysql mysql連線與斷開伺服器
為了連線伺服器,當呼叫mysql時,通常需要提供乙個mysql使用者名稱並且很可能需要乙個 密碼。如果伺服器執行在登入伺服器之外的其它機器上,還需要指定主機名。聯絡管理員以找出進行連線所使用的引數 即,連線的主機 使用者名稱和使用的密碼 知道正確的引數後,可以按照以下方式進行連線 shell mys...