最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2019年05月20日 14:25:37   作者:Anyanyamy  
如果不主動關閉socket的話,系統不會自動關閉的,除非當前進程掛掉了,操作系統把占用的socket回收了才會關閉。小編今天跟大家簡單介紹下如何在C語言中判斷socket是否已經斷開

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

注意要區(qū)分不同操作系統分別進行測試, 包括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保證了僅僅進行狀態(tài)判斷,而不影響數據接收

對于主動關閉的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 */)

因此對于簡單的狀態(tài)判斷(不過多考慮異常情況),
    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實行心跳檢測。

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

相關文章

  • C/C++中虛函數詳解及其作用介紹

    C/C++中虛函數詳解及其作用介紹

    這篇文章主要介紹了C/C++中虛函數詳解及其作用介紹,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-09-09
  • C語言頭文件<string.h>函數詳解

    C語言頭文件<string.h>函數詳解

    本文主要介紹了C語言頭文件<string.h>函數詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-07-07
  • C/C++判斷傳入的UTC時間是否當天的實現方法

    C/C++判斷傳入的UTC時間是否當天的實現方法

    在項目中經常會顯示一個時間,如果這個時間在今日內就顯示為時分秒,否則顯示為年月日,有需要的朋友可以參考一下
    2014-01-01
  • C語言數據結構遞歸之斐波那契數列

    C語言數據結構遞歸之斐波那契數列

    這篇文章主要介紹了C語言數據結構遞歸之斐波那契數列的相關資料,希望通過本文能幫助到大家,讓大家理解掌握這部分內容,需要的朋友可以參考下
    2017-10-10
  • 生成隨機數rand函數的用法詳解

    生成隨機數rand函數的用法詳解

    本篇文章是對生成隨機數rand函數的用法進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • C++泛型算法的一些總結

    C++泛型算法的一些總結

    以下是對C++中的泛型算法進行了總結介紹。需要的朋友可以過來參考下
    2013-08-08
  • C語言中關于sizeof 和 strlen的區(qū)別分析

    C語言中關于sizeof 和 strlen的區(qū)別分析

    本文通過示例簡單分析了4種情況下C語言中sizeof 和 strlen的區(qū)別,算是個人經驗的一個小小的總結,如有遺漏還請大家告知。
    2015-02-02
  • c++中的單例類模板的實現方法詳解

    c++中的單例類模板的實現方法詳解

    這篇文章主要介紹了c++中的單例類模板的實現方法詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-03-03
  • C++ auto類型說明符

    C++ auto類型說明符

    在C++11中引入了auto類型說明符,用它就能讓編譯器替我們去分析表達式所屬的類型。當然,auto變量必須有初始值,這樣編譯器才能推斷其類型
    2016-03-03
  • c++中inline的用法分析

    c++中inline的用法分析

    本篇文章是對c++中inline的用法進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05

最新評論

无极县| 尚志市| 万安县| 阿克| 宽城| 克东县| 淮北市| 依安县| 扎兰屯市| 乌拉特前旗| 大英县| 宜良县| 北安市| 邵阳市| 内乡县| 榆社县| 澳门| 商河县| 晋江市| 泊头市| 拜泉县| 千阳县| 万年县| 喀喇| 益阳市| 土默特左旗| 辽宁省| 唐海县| 夏津县| 金寨县| 澄江县| 汾阳市| 焦作市| 平罗县| 福建省| 巧家县| 和田县| 同江市| 盈江县| 台中县| 九江县|