더북(TheBook)

3.6.2 논블로킹 I/O

앞서 언급한 대로 기본 설정상 소켓은 블로킹 모드로 동작한다. 하지만 소켓은 논블로킹(non-blocking) 모드도 지원한다. 소켓이 논블로킹 모드로 설정되면 블로킹을 거는 대신 즉시 리턴하며, 그 결과는 -1이 된다. 그리고 그 에러 코드는 플랫폼마다 errno에서 EAGAIN, WSAGetLastError()에서 WSAEWOULDBLOCK이 된다. 이 코드의 뜻은 앞서 소켓 동작이 원래 블로킹되었어야 하는데 그러지 않고 빠져나왔다는 뜻이다. 에러 코드가 리턴되기는 했지만 실제 에러는 아니므로 다르게 처리해야 한다.

윈도에서 소켓을 논블로킹 모드로 만들려면 ioctlsocket() 함수를 사용한다.

int ioctlsocket(SOCKET sock, long cmd, u_long* argp);

sock은 논블로킹 모드로 두고 싶은 소켓이다.

cmd는 제어하고자 하는 소켓 파라미터이다. 여기선 FIONBIO를 지정한다.

argp는 파라미터에 설정하려는 값이다. 0이 아닌 값을 넣으면 논블로킹 모드가 되고, 0을 넣으면 블로킹 모드가 된다.

POSIX 호환 운영체제에선 fcntl() 함수를 사용한다.

int fcntl(int sock, int cmd, ...);

sock은 논블로킹 모드로 두고 싶은 소켓이다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.