TCP 連接空閒時,一方異常斷電、斷網、路由故障,另一方無法感知,除非發送數據才收到錯誤。需及時檢測失效連接並優雅清理。
SO_KEEPALIVE。setsockopt + SIO_KEEPALIVE_VALS (Windows) 或 TCP_KEEPIDLE/INTVL/COUNT (Linux) 自定義參數。// Windows 設置示例
BOOL bKeepAlive = TRUE;
setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, (char*)&bKeepAlive, sizeof(bKeepAlive));
tcp_keepalive alive_in = {0};
alive_in.keepalivetime = 5000; // 5 秒後首次探測
alive_in.keepaliveinterval = 1000; // 間隔 1 秒
alive_in.onoff = TRUE;
WSAIoctl(sock, SIO_KEEPALIVE_VALS, &alive_in, sizeof(alive_in), &alive_out, sizeof(alive_out), &ulBytesReturn, NULL, NULL);
| 場景 | 推薦 |
|---|---|
| 純內網、簡單服務、不想改協議 | Keepalive |
| 跨公網、穿透 NAT、需業務級存活確認 | 心跳包 |
| 高可靠要求 | 雙重保障 |
Keepalive 由內核處理,對 IOCP/Select 模型均能觸發可讀/錯誤事件,應用層無感知;心跳包靈活但開發成本高。