如何在Windows Server 2008上设置Keepalive

时间:2010-07-04 02:59:35

标签: windows-server-2008 tcp winsock keep-alive

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

2 个答案:

答案 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应该设置为半小时左右,当然不是半秒。