接続が確立された後、どのピアもデータを送信しない場合、 ネットワーク上にパケットは送信されません。TCPはアイドルプロトコルであるため、 接続がまだアクティブであると見なされます。
2 番目の接続を開いて接続を試みることもできますが、これにはいくつかの欠点があります。より多くのリソースを消費し、新しいスレッドを作成するなどの問題があります。また、相手ピアが再起動した場合、2 番目の接続は機能しますが、最初の接続は機能しません。
ハーフオープン接続で ping やメッセージを送信しようとしても、エラーが発生しないことがわかります。
TCP キープアライブパケットは、接続の現在のシーケンス番号より 1 少ないシーケンス番号が設定された単純な ACK です。これらの ACK のいずれかを受信したホストは、現在のシーケンス番号の ACK で応答します。キープアライブは、接続のリモート端にあるコンピューターがまだ利用可能かどうかを確認するために使用できます。TCP キープアライブは、TCP 接続でデータまたは上位レベルのキープアライブが送信されていない場合、TCPKeepAlive.Time ごとに 1 回(デフォルトは 7,200,000 ミリ秒または 2 時間)送信できます。キープアライブへの応答がない場合、TCPKeepAlive.Interval 秒ごとに 1 回繰り返されます。KeepAliveInterval のデフォルトは 1000 ミリ秒です。
接続ごとの KeepAlive を有効にして、TCP プロトコルが接続がアクティブかどうかを確認できるようにすることができます。これは切断されたドロップを検出したい場合(たとえば、ネットワークケーブルを抜いたとき)に推奨される方法です。
oClient := TsgcWebSocketClient.Create(nil);
oClient.TCPKeepAlive.Enabled := True;
oClient.TCPKeepAlive.Time := 5000;
oClient.TCPKeepAlive.Interval := 1000;