如何在C語(yǔ)言中判斷socket是否已經(jīng)斷開(kāi)
下面來(lái)介紹判斷非阻塞SOCKET是否已經(jīng)斷開(kāi)的幾種方法:
注意要區(qū)分不同操作系統(tǒng)分別進(jìn)行測(cè)試, 包括WINDOWS, LINUX和UNIX會(huì)各有不同。
在WINDOWS下比較簡(jiǎn)單,可以使用FD_CLOSE事件判斷SOCKET是否已經(jīng)斷開(kāi)
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的方式進(jìn)行判斷,其中MSG_PEEK保證了僅僅進(jìn)行狀態(tài)判斷,而不影響數(shù)據(jù)接收
對(duì)于主動(dòng)關(guān)閉的SOCKET, recv返回-1,而且errno被置為9(#define EBADF 9 /* Bad file number */)
或104 (#define ECONNRESET 104 /* Connection reset by peer */)
對(duì)于被動(dòng)關(guān)閉的SOCKET,recv返回0,而且errno被置為11(#define EWOULDBLOCK EAGAIN /* Operation would block */)
對(duì)正常的SOCKET, 如果有接收數(shù)據(jù),則返回>0, 否則返回-1,而且errno被置為11(#define EWOULDBLOCK EAGAIN /* Operation would block */)
因此對(duì)于簡(jiǎn)單的狀態(tài)判斷(不過(guò)多考慮異常情況),
recv返回>0, 正常
返回-1,而且errno被置為11 正常
其它情況 關(guān)閉
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; }
此外,所有操作系統(tǒng)上還可以通過(guò)TCP_KEEPLIVE實(shí)行心跳檢測(cè)。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
OpenCV獲取圖像中直線上的數(shù)據(jù)具體流程
對(duì)圖像進(jìn)行處理時(shí),經(jīng)常會(huì)有這類需求:客戶想要提取出圖像中某條直線或者ROI區(qū)域內(nèi)的感興趣數(shù)據(jù),進(jìn)行重點(diǎn)關(guān)注,怎么操作呢,下面小編通過(guò)實(shí)例代碼介紹下OpenCV獲取圖像中直線上的數(shù)據(jù),一起看看吧2021-11-11C++中實(shí)現(xiàn)子進(jìn)程執(zhí)行和管道通信詳解
在這篇博客中,我們將深入探索如何在 C++ 程序中實(shí)現(xiàn)子進(jìn)程的創(chuàng)建與執(zhí)行,以及父子進(jìn)程間的管道通信,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-01-01C語(yǔ)言實(shí)現(xiàn)自行車存放管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)自行車存放管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08C++基于Boost庫(kù)實(shí)現(xiàn)命令行解析
Boost庫(kù)中默認(rèn)自帶了一個(gè)功能強(qiáng)大的命令行參數(shù)解析器,以往我都是自己實(shí)現(xiàn)參數(shù)解析的,今天偶爾發(fā)現(xiàn)這個(gè)好東西,就來(lái)總結(jié)一下參數(shù)解析的基本用法,該庫(kù)需要引入program_options.hpp頭文件,即可使用了2021-06-06Qt出現(xiàn)假死凍結(jié)現(xiàn)象的原因及解決方法
應(yīng)用程序出現(xiàn)假死或凍結(jié)現(xiàn)象通常是由于一些常見(jiàn)問(wèn)題所導(dǎo)致的,本文主要介紹了Qt出現(xiàn)假死凍結(jié)現(xiàn)象的原因及解決方法,具有一定的參考價(jià)值,感興趣的可以了解一下2023-10-10VC程序在Win32環(huán)境下動(dòng)態(tài)鏈接庫(kù)(DLL)編程原理
這篇文章主要介紹了VC程序在Win32環(huán)境下動(dòng)態(tài)鏈接庫(kù)(DLL)編程原理,包括了dll文件的原理與具體實(shí)現(xiàn)過(guò)程,對(duì)于深入掌握VC程序設(shè)計(jì)具有很好的參考借鑒價(jià)值,需要的朋友可以參考下2014-10-10C語(yǔ)言進(jìn)階輸入輸出重定向與fopen函數(shù)使用示例詳解
這篇文章主要為大家介紹了C語(yǔ)言進(jìn)階輸入輸出重定向與fopen函數(shù)的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-02-02