我有 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。