如何在 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