ここのいくつかの投稿に基づいて、Socket KeepAlive を設定するための次の簡単な方法を作成しましたが、うまくいくようです。2 つのサービス間の接続を切断するためにイーサネット ケーブルを抜いた後、ネットワーク ライブラリは SocketAsyncEventArgs Completed イベントで 0-bytes-transferred を処理し、Disconnected イベントを発生させることができます。
しかし、何らかの理由で、ミリ秒ではなく 100 分の 1 秒を使用する必要があります。これについて私が見つけることができるすべてのドキュメントは、ミリ秒を使用する必要があることを示しているようです。
(編集)返されたバイトがこれらの他の2つの方法と一致することを確認しました:
http://www.codeproject.com/Articles/117557/Set-Keep-Alive-Values
(編集) これも WireSharked しており、間隔が 500 に設定されている場合、KeepAlive が 5 秒ごとに送信されていることを確認できます。
何を与える?最新バージョンの .NET で問題が発生しましたか?
private static byte[] GetKeepAliveOption(bool isEnabled, int keepAliveTime, int keepAliveInterval)
{
//time and interval are in hundredths of a second to work properly
//12 keepalive bytes, 1st 4 for enabled, next 4 for time, next 4 for interval
byte[] bytes = new byte[12];
if (isEnabled)
{
bytes[0] = 1;
}
byte[] keepAliveTimeBytes = BitConverter.GetBytes(KeepAliveTime);
Buffer.BlockCopy(keepAliveTimeBytes, 0, bytes, 4, 4);
byte[] keepAliveIntervalBytes = BitConverter.GetBytes(KeepAliveInterval);
Buffer.BlockCopy(keepAliveIntervalBytes, 0, bytes, 8, 4);
return bytes;
}