2

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

但是在赢。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 和更高版本上,只有当套接字处于众所周知的状态而不是过渡状态时,才能使用 setsockopt 函数设置 SO_KEEPALIVE 套接字选项。对于 TCP,SO_KEEPALIVE 套接字选项应该在调用连接函数(connect、ConnectEx、WSAConnect、WSAConnectByList 或 WSAConnectByName)之前设置,或者在连接请求实际完成之后设置。如果连接函数是异步调用的,那么这需要在尝试设置 SO_KEEPALIVE 套接字选项之前等待连接完成。如果应用程序在连接请求仍在处理中时尝试设置 SO_KEEPALIVE 套接字选项,则 setsockopt 函数将失败并返回 WSAEINVAL。

4

2 回答 2

1

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


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

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

于 2010-07-05T02:59:02.843 回答
0

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

于 2010-07-04T05:20:36.803 回答