我在构建一个使用Socket进行通讯的服务端和客户端通讯软件,用C++/CLI开发,
下面代码中的Socket->innerSocket就是C++中的SOCKET,
问题是:我开启了Socket的KeepAlive属性,但当我在用WSAWaitForMultipleEvents时,
关闭了远程客户端,服务器端却检测不到客户端关闭,而一直阻塞在那个位置,
是没设置好KeepAlive吗,还是WSAWaitForMultipleEvents根本就检测不到超时导致的FD_Close事件
void RunMethod(Object^ state)
{
WSAEVENT evt=WSACreateEvent();
WSAEventSelect(Socket->innerSocket, evt, FD_READ|FD_CLOSE|FD_WRITE);  
int err;
OnBeforeRunning(EventArgs::Empty);
while(true)
{
err=WSAWaitForMultipleEvents(1, &evt, FALSE, -1, FALSE); 
Recevied=0;
if(err == WSA_WAIT_FAILED || err == WSA_WAIT_TIMEOUT)
{
break;
}
WSANETWORKEVENTS event;
WSAEnumNetworkEvents(Socket->innerSocket,evt, &event);
if(event.lNetworkEvents & FD_WRITE)
{

}
else if(event.lNetworkEvents & FD_READ)
{
OnReceiving(EventArgs::Empty);
}
else if(event.lNetworkEvents & FD_CLOSE)
{
OnClosing(EventArgs::Empty);
SocketSession::~SocketSession();
break;
}
}
}
这一段是设置SocketKeepAlive属性的代码,网上复制来稍作修改用
tcp_keepalive inKeepAlive = {0};
unsigned long ulInLen = sizeof(tcp_keepalive);
tcp_keepalive outKeepAlive = {0};
unsigned long ulOutLen = sizeof(tcp_keepalive);
unsigned long ulBytesReturn = 0;
inKeepAlive.onoff = 1;
inKeepAlive.keepaliveinterval = 10;
inKeepAlive.keepalivetime = 3;if (WSAIoctl(s, SIO_KEEPALIVE_VALS, 
(LPVOID)&inKeepAlive, ulInLen, 
(LPVOID)&outKeepAlive, ulOutLen, 
&ulBytesReturn, NULL, NULL) == SOCKET_ERROR)
{
return false;
}
return true;