如何在C语言中判断插座是否已经断开

  

下面来介绍判断非阻塞套接字是否已经断开的几种方法:

  

注意要区分不同操作系统分别进行测试,包括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语言中判断插座是否已经断开