더북(TheBook)

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();
}

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