어떻게 C 언어 에서 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 에서 심장 박동 검 사 를 실시 합 니 다.이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
c 언어 간단한 파일 r/w 조작 방법데이터의 입력과 출력은 거의 모든 C 언어 프로그램과 수반된다. 입력이란 원본에서 데이터를 얻는 것이다. 출력은 단말기에 데이터를 쓰는 것으로 이해할 수 있다.이곳의 원본은 키보드, 마우스, 하드디스크, 시디, 스캐...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.