溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何在C語(yǔ)言中判斷socket是否已經(jīng)斷開

發(fā)布時(shí)間:2020-08-27 19:35:00 來(lái)源:腳本之家 閱讀:198 作者:Anyanyamy 欄目:編程語(yǔ)言

下面來(lái)介紹判斷非阻塞SOCKET是否已經(jīng)斷開的幾種方法:

注意要區(qū)分不同操作系統(tǒng)分別進(jìn)行測(cè)試, 包括WINDOWS, LINUX和UNIX會(huì)各有不同。

在WINDOWS下比較簡(jiǎn)單,可以使用FD_CLOSE事件判斷SOCKET是否已經(jīng)斷開

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í)有所幫助,也希望大家多多支持億速云。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI