天天看點

keepalive

在TCP中有一個Keep-alive的機制可以檢測死連接配接,原理很簡單,TCP會在空閑了一定時間後發送資料給對方:

1.如果主機可達,對方就會響應ACK應答,就認為是存活的。

2.如果可達,但應用程式退出,對方就發RST應答,發送TCP撤消連接配接。

3.如果可達,但應用程式崩潰,對方就發FIN消息。

4.如果對方主機不響應ack, rst,繼續發送直到逾時,就撤消連接配接。這個時間就是預設

的二個小時。

uses WinSock2;

procedure TForm1.IdTCPServer1Connect(AThread: TIdPeerThread);

type

TCP_KeepAlive = record

OnOff: Cardinal;

KeepAliveTime: Cardinal;

KeepAliveInterval: Cardinal

end;

var

Val: TCP_KeepAlive;

Ret: DWord;

begin

Val.OnOff:=1;

Val.KeepAliveTime:=6000; //6s

Val.KeepAliveInterval:=6000; //6s

WSAIoctl(AThread.Connection.Socket.Binding.Handle, IOC_IN or IOC_VENDOR or 4,

@Val, SizeOf(Val), nil, 0, @Ret, nil, nil)

--------------------------------------------------------

KeepAliveTime 值控制 TCP/IP 嘗試驗證空閑連接配接是否完好的頻率。如果這段時間内沒有活動,則會發送保持活動信号。如果網絡工作正常,而且接收方是活動的,它就會響應。如果需要對丢失接收方敏感,換句話說,需要更快地發現丢失了接收方,請考慮減小這個值。如果長期不活動的空閑連接配接出現次數較多,而丢失接收方的情況出現較少,您可能會要提高該值以減少開銷。預設情況下,如果空閑連接配接 7200000 毫秒(2 小時)内沒有活動,Windows 就發送保持活動的消息。通常,1800000 毫秒是首選值,進而一半的已關閉連接配接會在 30 分鐘内被檢測到。

KeepAliveInterval 值定義了如果未從接收方收到保持活動消息的響應,TCP/IP 重複發送保持活動信号的頻率。當連續發送保持活動信号、但未收到響應的次數超出 TcpMaxDataRetransmissions 的值時,會放棄該連接配接。如果期望較長的響應時間,您可能需要提高該值以減少開銷。如果需要減少花在驗證接收方是否已丢失上的時間,請考慮減小該值或 TcpMaxDataRetransmissions 值。預設情況下,在未收到響應而重新發送保持活動的消息之前,Windows 會等待 1000 毫秒(1 秒)。

KeepAliveTime 根據你的需要設定就行,比如10分鐘,注意要轉換成MS。

XXX代表這個間隔值得大小[1]

繼續閱讀