国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C > 正文

如何在C語言中判斷socket是否已經斷開

2020-01-26 13:27:59
字體:
來源:轉載
供稿:網友

下面來介紹判斷非阻塞SOCKET是否已經斷開的幾種方法:

注意要區分不同操作系統分別進行測試, 包括WINDOWS, LINUX和UNIX會各有不同。

在WINDOWS下比較簡單,可以使用FD_CLOSE事件判斷SOCKET是否已經斷開

view plaincopy to clipboardprint?bool IsSocketClosed(SOCKET clientSocket) {  bool ret = false;  HANDLE closeEvent = WSACreateEvent();  WSAEventSelect(clientSocket, closeEvent, FD_CLOSE);   DWORD dwRet = WaitForSingleObject(closeEvent, 0);   if(dwRet == WSA_WAIT_EVENT_0)  ret = true;  else if(dwRet == WSA_WAIT_TIMEOUT)  ret = false;   WSACloseEvent(closeEvent);  return ret; }  

在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  正常
    其它情況    關閉

view plaincopy to clipboardprint?#include <errno.h>  bool IsSocketClosed(int clientSocket) {  char buff[32];  int recvBytes = recv(clientSocket, buff, sizeof(buff), MSG_PEEK);   int sockErr = errno;   //cout << "In close function, recv " << recvBytes << " bytes, err " << sockErr << endl;   if( recvBytes > 0) //Get data  return false;   if( (recvBytes == -1) && (sockErr == EWOULDBLOCK) ) //No receive data  return false;   return true; } 

此外,所有操作系統上還可以通過TCP_KEEPLIVE實行心跳檢測。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 界首市| 石渠县| 崇州市| 宁武县| 炉霍县| 神池县| 栖霞市| 蓝田县| 行唐县| 黄骅市| 大渡口区| 全州县| 肥城市| 盘锦市| 秀山| 麻栗坡县| 楚雄市| 甘德县| 岑溪市| 广水市| 西吉县| 九江市| 常山县| 玉门市| 凤冈县| 甘谷县| 古丈县| 东丽区| 永平县| 蓬莱市| 漠河县| 苏尼特右旗| 汉川市| 志丹县| 磐石市| 荃湾区| 和林格尔县| 怀仁县| 綦江县| 乐清市| 曲麻莱县|