分类:
2013-01-14 10:58:15
原文地址:判断socket连接是否断开 作者:chenmeng11
在UNIX/LINUX下,非阻塞模式SOCKET可以采用recv+MSG_PEEK的方式进行判断,其中MSG_PEEK保证了仅仅进行状态判断,而不影响数据接收
对于主动关闭的SOCKET, recv返回-1,而且errno被置为9(#define EBADF 9 /* Bad file number */)
或104 (#define ECONNRESET 104 /* Connection reset by peer */)
对于被动关闭的SOCKET,recv返回0,而且errno被置为11(#define EWOULDBLOCK EAGAIN /* Operation would block */)
对正常的SOCKET, 如果有接收数据,则返回>0, 否则返回-1,而且errno被置为11(#define EWOULDBLOCK EAGAIN /* Operation would block */)
因此对于简单的状态判断(不过多考虑异常情况),
recv返回>0, 正常
返回-1,而且errno被置为11 正常
其它情况 关闭
注意要区分不同操作系统分别进行测试, 包括WINDOWS, LINUX和UNIX会各有不同
在WINDOWS下比较简单,可以使用FD_CLOSE事件判断SOCKET是否已经断开
view plaincopy to clipboardprint?
01.bool IsSocketClosed(SOCKET clientSocket)
02.{
03. bool ret = false;
04. HANDLE closeEvent = WSACreateEvent();
05. WSAEventSelect(clientSocket, closeEvent, FD_CLOSE);
06.
07. DWORD dwRet = WaitForSingleObject(closeEvent, 0);
08.
09. if(dwRet == WSA_WAIT_EVENT_0)
10. ret = true;
11. else if(dwRet == WSA_WAIT_TIMEOUT)
12. ret = false;
13.
14. WSACloseEvent(closeEvent);
15. return ret;
16.}