如何在 Windows Server 2008 上设置 Keepalive

Posted

技术标签:

【中文标题】如何在 Windows Server 2008 上设置 Keepalive【英文标题】:How to set Keepalive on Windows Server 2008 【发布时间】:2010-07-04 02:59:34 【问题描述】:

我有一个 win32 应用程序,其中 winsock 用于 TCP/IP 通信。 我正在使用 WSAIoctl 函数设置 keepalive 值,它在 Windows XP 上正常工作

但是在 Win 上。 Server 2008 WSAIoctl 失败,WSAGetLastError 返回 10022(无效参数),这没有任何意义。

我设置keepalive的代码如下;


// set per-connection keep-alive option 
tcp_keepalive keepAliveSettings; 
keepAliveSettings.onoff = 1; 
keepAliveSettings.keepalivetime = 500; 
eepAliveSettings.keepaliveinterval = 25;

int lastError = WSAIoctl(m_soc.chns[0], SIO_KEEPALIVE_VALS, &keepAliveSettings, sizeof(keepAliveSettings), NULL, 0, &BytesReturned, NULL, NULL); if(lastError == SOCKET_ERROR) lastError = WSAGetLastError(); Logger::Error("Setting keepalive failed ErrCode %d\n",lastError);

编辑:

我找到了解决方案,也许它可以帮助遇到同样问题的其他人。我试图在异步之后设置keepalive。连接调用,但现在我在连接调用完成后进行设置,这解决了问题。

来自http://msdn.microsoft.com/en-us/library/ee470551(v=VS.85).aspx

在 Windows Vista 及更高版本上, SO_KEEPALIVE 套接字选项只能是 使用 setsockopt 函数设置时 套接字处于众所周知的状态 不是过渡状态。对于 TCP, SO_KEEPALIVE 套接字选项应该是 在连接函数之前设置 (连接、ConnectEx、WSAConnect、 WSAConnectByList 或 WSAConnectByName) 被调用,或者在连接之后 请求实际上已经完成。如果 连接函数被调用 异步,那么这需要 等待连接完成 在尝试设置 SO_KEEPALIVE 之前 套接字选项。如果一个应用程序 尝试设置 SO_KEEPALIVE 连接时的套接字选项 请求仍在处理中, setsockopt 函数将失败并且 返回 WSAEINVAL。

【问题讨论】:

【参考方案1】:

我找到了解决方案,也许它可以帮助遇到同样问题的其他人。 我试图在异步之后设置keepalive。连接呼叫,但现在我在完成连接呼叫后进行设置,这解决了问题。

来自http://msdn.microsoft.com/en-us/library/ee470551(v=VS.85).aspx

在 Windows Vista 及更高版本上, SO_KEEPALIVE 套接字选项只能是 使用 setsockopt 函数设置时 套接字处于众所周知的状态 不是过渡状态。对于 TCP, SO_KEEPALIVE 套接字选项应该是 在连接函数之前设置 (连接、ConnectEx、WSAConnect、 WSAConnectByList 或 WSAConnectByName) 被调用,或者在连接之后 请求实际上已经完成。如果 连接函数被调用 异步,那么这需要 等待连接完成 在尝试设置 SO_KEEPALIVE 之前 套接字选项。如果一个应用程序 尝试设置 SO_KEEPALIVE 连接时的套接字选项 请求仍在处理中, setsockopt 函数将失败并且 返回 WSAEINVAL。

【讨论】:

一个建议:不要回答你自己的问题。如果您找到了答案,请编辑您的问题并提及答案。 仅供参考,*** 允许您在两天后回答自己的问题。【参考方案2】:

可能内核反对您选择的值。我会。您不能认真地将保持活动间隔设置为 25 毫秒。这是一个完全疯狂的价值。默认值为两小时,将其设置为低于几分钟是没有意义的。同样,keepalivetime 应该设置为半小时左右,当然不是半秒。

【讨论】:

您好 EJP,默认 keepaliveinterval 不是 2 小时。但是默认keepalivetime是2小时,默认keepaliveinterval是1000ms。我知道这些值对于普通的网络应用程序来说是疯狂的,但是这个应用程序是在 LAN 上运行的,所以它们做得很好。 technet.microsoft.com/en-us/library/cc782936(WS.10).aspxtechnet.microsoft.com/en-us/library/cc758083(WS.10).aspx 保持活动探测之间的默认间隔为 2 小时。这是 RFC 中规定的。一秒或更短的时间间隔是疯狂的,LAN 或没有 LAN。如果他们做得很好,究竟是什么问题?

以上是关于如何在 Windows Server 2008 上设置 Keepalive的主要内容,如果未能解决你的问题,请参考以下文章

如何在我的 windows 2008 Server 2008 R2 上安装 pdo_sqlsrv? [关闭]

如何通过 C++ 程序在 Windows server 2008/2012 上初始化磁盘

如何在 Windows server 2008 R2 上安装 PayPal API 证书

如何在Windows Server 2008 R2上开启Windows Power Shell ISE

如何在 Windows Server 2008 R1 上安装 .NET Framework 4.5 参考库?

如何删除windows server 2008R2上面的OU