【问题标题】:Socket KeepAlive Units套接字 KeepAlive 单元
【发布时间】:2014-02-18 22:46:01
【问题描述】:

根据这里的一些帖子,我编写了以下简单的方法来设置我的 Socket KeepAlive,它似乎有效。在我拔下以太网电缆以断开两个服务之间的连接后,我的网络库可以处理 SocketAsyncEventArgs Completed 事件上传输的 0 字节并触发 Disconnected 事件。

但由于某种原因,我需要使用百分之一秒而不是毫秒。我能找到的所有文档似乎都表明我应该使用毫秒。

(编辑)我现在已经验证返回的字节与其他两种方法匹配:

http://www.codeproject.com/Articles/117557/Set-Keep-Alive-Values

http://social.msdn.microsoft.com/Forums/en-US/35dfb50e-1e14-40c1-af01-f359be4d6a02/how-to-set-socket-keep-alive-timeinterval-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() 调用之外的所有代码)提取到具有三个参数(enabledtimeinterval)的单独方法中,该方法返回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


【解决方案1】:

在 cmets 中回答了我自己的问题。抱歉,这是我的第一篇文章,我应该在这样的答案中这样做。

这里的要点是理解参数:

  • KeepAliveTime 是发送 KeepAlive 消息的时间间隔。

  • KeepAliveInterval 是初始 KeepAlive 消息未被确认时发送重新传输探测之间的间隔。

【讨论】:

    猜你喜欢
    • 2016-06-12
    • 2020-11-30
    • 1970-01-01
    • 2013-11-16
    • 1970-01-01
    • 2013-12-29
    • 2013-05-10
    • 1970-01-01
    • 2011-05-31
    相关资源
    最近更新 更多