소켓을 논블로킹 모드로 설정하면 보통 땐 작업이 완료되기 전까지 블로킹을 걸던 함수들이 이제는 즉시 리턴한다고 가정하고 프로그램해도 된다. 논블로킹 소켓을 사용하는 게임 루프는 코드 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바이트짜리 데이터그램을 반복해 쏟아부어 서버가 게임 시뮬레이션을 하지 못하게 만들 수 있기 때문이다.