根据这里的一些帖子,我编写了以下简单的方法来设置我的Socket KeepAlive,它似乎有效。在我拔掉以太网电缆以断开两个服务之间的连接后,我的网络库可以处理SocketAsyncEventArgs已完成事件上的0字节传输,并启动一个断开连接的事件。
但由于某种原因,我需要使用百分之一秒而不是毫秒。我在这上面找到的所有文档似乎表明我应该使用毫秒。
(编辑)我现在已经验证返回的字节与其他两种方法匹配:
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;
}
答案 0 :(得分:2)
在评论中回答了我自己的问题。对不起,这是我的第一篇文章,我应该在这样的答案中这样做。
这是要理解参数:
KeepAliveTime是发送KeepAlive消息之间的间隔。
KeepAliveInterval是在未执行初始KeepAlive消息时发送重新传输探测之间的间隔。