어떻게 C 언어 에서 socket 이 끊 겼 는 지 판단 합 니까?

2224 단어 c 언어socket
비 차단 SOCKET 이 끊 겼 는 지 판단 하 는 몇 가지 방법 을 소개 한다.
WINDOWS,LINUX,UNIX 를 포함 한 운영 체 제 를 구분 해 각각 테스트 해 야 한다.
WINDOWS 에 서 는 쉽게 FD 를 사용 할 수 있 습 니 다.닫 기 이벤트 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 방식 으로 판단,그 중 MSGPEEK 는 데이터 수신 에 영향 을 주지 않 고 상태 판단 만 할 것 을 보증 했다.
주동 적 으로 닫 힌 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 EWOULBLOCK EAGAIN/*Operation would block*/)로 설정 되 어 있 습 니 다.
정상 적 인 SOCKET 에 대해 서 는 수신 데이터 가 있 으 면>0 으로 되 돌아 갑 니 다.그렇지 않 으 면-1 로 되 돌아 갑 니 다.그리고 errno 는 11(\#define EWOULBLOCK 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 에서 심장 박동 검 사 를 실시 합 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기