recv() 에서 블럭킹 관련 질문
글쓴이: lovejin0309 / 작성시간: 화, 2006/04/04 - 4:15오후
소켓 프로그래밍을 짜고 있습니다.
다음과 같은 형태로 recv() 함수를 사용하고 있습니다.
error = recv(SockFD, message, MSG_LEN, MSG_NOSIGNAL);
위와 같이 recv() 함수를 불렀는데, 만약에 소켓에 수신된 데이터가 없으면 얼마간을 대기 했다가 recv() 함수를 종료하게 됩니다.
제가 원하는 것은 recv() 함수를 호출 했을 때 소켓 수신 버퍼가 비어 있으면 기다리지 않고 바로 recv() 함수를 종료하는 것입니다.
어떻게 해야 할까요?
Forums:


해당 소켓을
해당 소켓을 non-blocking으로 바꾸시면 됩니다. 플랫폼별로 다른 방법을 사용하니 해당 플랫폼의 문서를 참고하세요.
// 최신버전의
recv(fd, 어쩌구... ); ==> nonblock( fd, 1); // 논블록모드로 세팅 recv(fd, 어쩌구... ); // 반드시 리턴값을 검사해야 함!!!! 매우 중요함!! // 논블록시의 리턴값과 블록시의 리턴값이 상이함! nonblock( fd, o); // 다시 블록모드로 세팅당연하게도 리턴값 검사는 하셔야 합니다. 위에 써드린 코드는 대략의 pseudo code 일뿐.
* nonblock으로 검색해 보면 이미 많은 구현이 있습니다.
운영체제 버전별로 다소 차이가 있으나, 대충 정리하면 아래와 같습니다.
골라서 테스트해보시고 쓰시길....
// 최신버전의 유닉스 : 대부분 int nonblock(int fd, int nblockFlag) { int flags; flags = fcntl( fd, F_GETFL, 0); if ( nblockFlag == 1 ) return fcntl( fd, F_SETFL, flags | O_NONBLOCK); else return fcntl( fd, F_SETFL, flags & (~O_NONBLOCK)); } // 오래된 버전의 유닉스들 int nonblock(int fd, int nblockFlag) { int flags; flags = nblockFlag; return ioctl( fd, FIONBIO, &flags); } // 윈도우 int nonblock(int fd, int nblockFlag) { unsigned long flags; flags = nblockFlag; return ioctlsocket( fd, FIONBIO, &flags); } // Amiga int nonblock(int fd, int nblockFlag) { return IoctlSocket( fd, FIONBIO, (long)nblockFlag); } // BeOS int nonblock(int fd, int nblockFlag) { long b = nblockFlag ? 1 : 0; return setsockopt(sockfd, SOL_SOCKET,SO_NONBLOCK,&b,sizeof(b)); }------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.
------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.
블럭킹 문제인줄
블럭킹 문제인줄 알았는데.
서버쪽에서 메시지를 전송한 다음 바로 끊어 버리네요.
이유는 불명이구요. ...
댓글 달기