【发布时间】:2014-02-18 22:46:01
【问题描述】:
根据这里的一些帖子,我编写了以下简单的方法来设置我的 Socket KeepAlive,它似乎有效。在我拔下以太网电缆以断开两个服务之间的连接后,我的网络库可以处理 SocketAsyncEventArgs Completed 事件上传输的 0 字节并触发 Disconnected 事件。
但由于某种原因,我需要使用百分之一秒而不是毫秒。我能找到的所有文档似乎都表明我应该使用毫秒。
(编辑)我现在已经验证返回的字节与其他两种方法匹配:
http://www.codeproject.com/Articles/117557/Set-Keep-Alive-Values
(编辑)我也对此进行了 WireSharked,并且可以验证当间隔设置为 500 时 KeepAlives 每隔 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;
}
【问题讨论】:
-
你的函数做了两件事。请仅显示相关代码。将“tcp_keepalive 结构创建代码”(除
socket.IOControl()调用之外的所有代码)提取到具有三个参数(enabled、time、interval)的单独方法中,该方法返回byte[]并显示预期和所需值的实际输出。这样,您可以在将字节传递给 IOControl 之前测试和验证字节是否包含您期望它们包含的内容。 -
感谢 CodeCaster 的评论。抱歉,我实际上只是想简化方法,但使用良好的编程实践并进行一些单元测试肯定不会有什么坏处;)我稍微改变了方法,并编辑了帖子以反映我所做的测试。我的结论? KeepAlive 现在需要百分之一秒,而不是毫秒。
-
您并没有真正引用任何权威资料表明该值实际上是毫秒。我认为你发现的这两篇文章是不正确的,而不是这种行为突然改变的可能性更大。
-
好点爱德华,对不起,我是新手,显然已经做出了假设。有问题的方法是socket.IOControl,它需要字节,我能找到的最好的是MSDN上的一些文章:[link]msdn.microsoft.com/en-us/library/windows/desktop/…和这个:[link]msdn.microsoft.com/en-us/library/windows/desktop/…,表示使用毫秒。
-
好的,对不起,我可以回答我自己的问题。最后是我对参数的误解。根据我上面评论中的文档,我可以解释 10 的系数。keepalivetime 参数是在发送 keepalive 之前有多少 mils 的静默。保活间隔是在发送重新传输探测之前等待多长时间没有对保活消息的确认。在 Windows 7 上,重新传输探测固定为 10,因此当我将两个 keepalive 参数都设置为 500 时,在识别断开之前需要 500 + 10*500 mils,即大约 5.5 秒。
标签: c# visual-studio-2012