cmd는 소켓에 내리려 하는 명령이다. 구식 POSIX 시스템이 아니라면 먼저 F_GETFL로 소켓에 원래 저장된 플래그를 가져와서 거기에 O_NONBLOCK을 비트 OR한 뒤, 그 값을 다시 F_SETFL 명령으로 소켓의 플래그를 덮어씌워야 한다. UDPSocket 클래스에 논블로킹 모드를 제어하는 함수를 코드 3-8과 같이 추가할 수 있다.
코드 3-8 UDPSocket 클래스에 논블로킹 모드 추가하기
int UDPSocket::SetNonBlockingMode(bool inShouldBeNonBlocking) { #if _WIN32 u_long arg = inShouldBeNonBlocking ? 1 : 0; int result = ioctlsocket(mSocket, FIONBIO, &arg); #else int flags = fcntl(mSocket, F_GETFL, 0); flags = inShouldBeNonBlocking ? (flags | O_NONBLOCK) : (flags & ~O_NONBLOCK); fcntl(mSocket, F_SETFL, flags); #endif if (result != SOCKET_ERROR) return NO_ERROR; SocketUtil::ReportError(L“UDPSocket::SetNonBlockingMode”); return SocketUtil::GetLastError(); }