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