下面来介绍判断非阻塞套接字是否已经断开的几种方法:
注意要区分不同操作系统分别进行测试,包括WINDOWS、LINUX和UNIX会各有不同。
在WINDOWS下比较简单,可以使用FD_CLOSE事件判断插座是否已经断开
视图plaincopy clipboardprint& # 63; bool IsSocketClosed(套接字clientSocket) { bool ret=false; 处理closeEvent=WSACreateEvent (); WSAEventSelect (clientSocket closeEvent FD_CLOSE); DWORD dwRet=WaitForSingleObject (closeEvent, 0); 如果(dwRet==WSA_WAIT_EVENT_0) ret=true; else if (dwRet==WSA_WAIT_TIMEOUT) ret=false; WSACloseEvent (closeEvent); 返回受潮湿腐烂; } >之前在UNIX/LINUX下,非阻塞模式插座可以采用recv + MSG_PEEK的方式进行判断,其中MSG_PEEK保证了仅仅进行状态判断,而不影响数据接收
对于主动关闭的插座,recv返回1,而且errno被置为9(#定义EBADF ,9/*错误的文件数量*/)
或104 (# define ECONNRESET 104/*连接重置点*/)
对于被动关闭的插座,recv返回0,而且errno被置为11(#定义EWOULDBLOCK EAGAIN/*操作将块*/)
对正常的插座,如果有接收数据,则返回祝辞0,否则返回1,而且errno被置为11(#定义EWOULDBLOCK EAGAIN/*操作将块*/)
因此对于简单的状态判断(不过多考虑异常情况),
,,recv返回祝辞0,,,正常
,,返回1,而且errno被置为11,正常
,,其它情况,,,关闭
视图plaincopy clipboardprint& # 63; # include & lt; errno.h> bool IsSocketClosed (int clientSocket) { char迷[32]; int recvBytes=recv (clientSocket,浅黄色,sizeof(浅黄色)MSG_PEEK); int sockErr=errno;//cout & lt; & lt;“近距离函数,recv”& lt; & lt;recvBytes & lt; & lt;“字节,犯错”& lt; & lt;sockErr & lt; & lt;endl; 如果(recvBytes比;0)//获取数据 返回错误; 如果((recvBytes==1),,(sockErr==EWOULDBLOCK))//不接收数据 返回错误; 返回true; } >之前此外,所有操作系统上还可以通过TCP_KEEPLIVE实行心跳检测。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
如何在C语言中判断插座是否已经断开