더북(TheBook)

소켓을 논블로킹 모드로 설정하면 보통 땐 작업이 완료되기 전까지 블로킹을 걸던 함수들이 이제는 즉시 리턴한다고 가정하고 프로그램해도 된다. 논블로킹 소켓을 사용하는 게임 루프는 코드 3-9와 같이 구현할 수 있다.

코드 3-9 논블로킹 소켓을 사용하는 게임 루프

void DoGameLoop()
{
    UDPSocketPtr mySock = SocketUtil::CreateUDPSocket(INET);
    mySock->SetNonBlockingMode(true);
    
    while (gIsGameRunning)
    {
        char data[1500];
        SocketAddress socketAddress;
        
        int bytesReceived = mySock->ReceiveFrom(
            data, sizeof(data), socketAddress);
        if (bytesReceived> 0)
            ProcessReceivedData(data, bytesReceived, socketAddress);
        
        DoGameFrame();
    }
}

소켓을 논블로킹 모드로 두고 게임 루프에서 매 프레임 새로운 데이터가 있는지 체크한다. 데이터가 있다면 대기열 중 첫 데이터그램을 처리한다. 데이터가 없으면 기다리지 않고 즉시 다음 내용을 수행한다. 한 번에 여러 데이터그램을 처리하고 싶다면 루프문을 하나 더 추가해 최댓값으로 지정한 숫자 또는 전체를 처리할 때까지 루프를 돌려 읽어 들이면 된다. 이때 프레임당 처리할 데이터그램 개수에 제약을 꼭 두어야 한다. 그러지 않으면 서버가 처리할 수 있는 능력 이상으로 악성 클라이언트가 1바이트짜리 데이터그램을 반복해 쏟아부어 서버가 게임 시뮬레이션을 하지 못하게 만들 수 있기 때문이다.

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