tcp心跳機制

2021-09-07 22:24:48 字數 1472 閱讀 3649

對連線上來的連線,進行檢測,以防止客戶端異常關閉,或線路異常斷開,而伺服器不知道,得到乙個半連線這種情況。

當然可以在協議裡加乙個心跳包,然後伺服器端定時檢測,過一段時間就去輪訓一次,看哪些連線超過多少時間沒有反應。超時就關閉。但這樣有點不爽,要自己寫程式碼來完成。還要鎖定連線列表,代價挺大的。

記得以前在網上看到可以用 tcp 的 keepalive 保活機制來做,但也看到人說沒有效果。我想定tcp協議的那此人,不會定一些無用的功能吧,但msdn上卻沒看到什麼有價值的東東。難道ms沒有實現它們?我決定試試。

1. delphi 的 winsock2.pas 不全,要加入一些東東,如下:

const

ioc_in               =80000000 h; // 這裡是 80000000 十六進製制,blog 有問題

ioc_vendor           =18000000 h; // 這裡是 80000000 十六進製制,blog 有問題

ioc_out              =40000000 h; // 這裡是 80000000 十六進製制,blog 有問題

sio_keepalive_vals   =ioc_in or ioc_vendor or 4;

type

ttcp_keepalive = packed record

onoff             : integer;

keepalivetime     : integer;

keepaliveinterval : integer;

end;

2. 在 accept 得到新連線時,設定它的保活時間, 如下:

// set keepalive 開啟保活機制

opt := 1;

if setsockopt(hclient,sol_socket, so_keepalive, @opt, sizeof(opt)) <> 0 then

begin

outputdebugstring('setsockopt keepalive error!!!');

end;

// keepalive time 設保活時間

klive.onoff := 1;              // 啟用保話

klive.keepalivetime := 10000; // 保話超時

klive.keepaliveinterval := 1; // 超時次數

if wsaioctl( hclient, sio_keepalive_vals,

@klive,

sizeof(ttcp_keepalive),

@outklive,

sizeof(ttcp_keepalive),

@opt,

0,nil) = socket_error then

begin

outputdebugstring('wsaioctl keepalive error');

end;

tcp心跳機制

對連線上來的連線,進行檢測,以防止客戶端異常關閉,或線路異常斷開,而伺服器不知道,得到乙個半連線這種情況。當然可以在協議裡加乙個心跳包,然後伺服器端定時檢測,過一段時間就去輪訓一次,看哪些連線超過多少時間沒有反應。超時就關閉。但這樣有點不爽,要自己寫程式碼來完成。還要鎖定連線列表,代價挺大的。記得以...

tcp心跳機制

對連線上來的連線,進行檢測,以防止客戶端異常關閉,或線路異常斷開,而伺服器不知道,得到乙個半連線這種情況。當然可以在協議裡加乙個心跳包,然後伺服器端定時檢測,過一段時間就去輪訓一次,看哪些連線超過多少時間沒有反應。超時就關閉。但這樣有點不爽,要自己寫程式碼來完成。還要鎖定連線列表,代價挺大的。記得以...

Eureka 心跳機制

server服務端 server port 8761 eureka client 例項是否在eureka伺服器上註冊自己的資訊以提供其他服務發現,預設為true register with eureka false 此客戶端是否獲取eureka伺服器登錄檔上的註冊資訊,預設為true fetch r...