我有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) 被叫,或在连接之后 请求实际完成。如果 调用connect函数 异步,然后这需要 等待连接完成 在尝试设置SO_KEEPALIVE之前 套接字选项。如果申请 尝试设置SO_KEEPALIVE 连接时的套接字选项 请求仍在进行中 setsockopt函数将失败并且 返回WSAEINVAL。
答案 0 :(得分: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) 被叫,或在连接之后 请求实际完成。如果 调用connect函数 异步,然后这需要 等待连接完成 在尝试设置SO_KEEPALIVE之前 套接字选项。如果申请 尝试设置SO_KEEPALIVE 连接时的套接字选项 请求仍在进行中 setsockopt函数将失败并且 返回WSAEINVAL。
答案 1 :(得分:0)
内核可能会反对您选择的值。我会。你不能真正想要将保持活动间隔设置为25ms。这是一个完全疯狂的价值。默认值为两小时,将其设置为低于几分钟没有任何意义。同样,keepalivetime应该设置为半小时左右,当然不是半秒。