socket用异步消息方式通信,我们知道在客户端socket关闭时,server端socket会收到FD_CLOSE消息,可是如果客户端是非正常关闭的话,服务器端就不知道该连接是不是还在,也就是说不能通过消息来及时知道socket的状态。我一般有两种做法,一种就是socket创建后,和客户端按照一定时间间隔发测试包,如果有几次(自己设定)没有收到测试包,则认为和客户端的连接已经断了,关闭对应socket.方法二:在服务器端按照一定时间间隔(定时)判断各个连接是否已经断了,如果是则关闭对应socket。不知道大家是怎么处理这个问题的?
我一般用icmp模拟ping的操作来判断网络是否正常
//丢了
}BOOL HasConnectionDropped(int sdin)
{
BOOL bConnDropped = FALSE;
INT iRet = 0;
BOOL bOK = TRUE;
if (sdin == INVALID_SOCKET)
return TRUE; struct timeval timeout = { 0, 0 };
fd_set readSocketSet;
FD_ZERO(&readSocketSet);
FD_SET(sdin, &readSocketSet);
iRet = ::select(0, &readSocketSet, NULL, NULL, &timeout);
bOK = (iRet > 0);
if(bOK)
{
bOK = FD_ISSET(sdin, &readSocketSet);
}
if(bOK)
{
CHAR szBuffer[1] = "";
iRet = ::recv(sdin, szBuffer, 1, MSG_PEEK);
bOK = (iRet > 0);
if(!bOK)
{
INT iError = ::WSAGetLastError();
bConnDropped = (( iError == WSAENETRESET) ||
(iError == WSAECONNABORTED) ||
(iError == WSAECONNRESET) ||
(iError == WSAEINVAL) ||
(iRet == 0));
}
}
return(bConnDropped);
}
用select函数判断。