더북(TheBook)

온라인 게임 프로그래밍에서 소켓은 파일 핸들1 방식과는 약간 다릅니다.

1. 게임 서버에서는 다루어야 하는 소켓 개수가 많습니다. TCP를 이용해서 통신하는 경우 클라이언트 개수만큼 소켓이 있어야 합니다.

2. 파일 핸들을 하는 동안 스레드가 대기하는 일이 없어야 합니다. 디스크를 읽거나 쓸 때 사용하는 read(), write() 함수는 호출 후 실행이 완료될 때까지 리턴하지 않습니다. 소켓을 이용해서 읽기/쓰기를 하는 함수를 호출했는데, 즉시 리턴하지 않는다면 이들을 호출한 메인 스레드는 사용자 입장에서 일시 정지를 하는 것처럼 보일 것입니다. 그러면 부드러운 애니메이션을 보여 줄 수가 없습니다.

이러한 이유 때문에 네트워크 프로그래밍에서 소켓은 보통 비동기 입출력(Asynchronous I/O) 상태로 다룹니다. 소켓을 비동기 입출력으로 다루는 방식에는 크게 논블로킹 소켓(non-blocking socket) 방식과 Overlapped I/O 방식이 있습니다. 그리고 이 방식들을 진보시킨 epoll과 I/O Completion Port(줄여서 IOCP) 방식이 많이 활용됩니다. 이 장에서는 블로킹, 논블로킹, Overlapped I/O, epoll, I/O Completion Port가 무엇인지, 어떻게 쓰는지 다룹니다.

처음부터 비동기 입출력 방식을 다루면 어려울 수 있으므로 먼저 동기 입출력 방식부터 알아봅시다. 소켓에 대한 동기 입출력 방식을 블로킹 소켓(blocking socket)이라고 합니다. 블로킹 소켓부터 완전히 이해하고 나머지 방법을 이해하면 좋습니다.

Tip

책에서는 소켓 프로그래밍에 대한 여러분 이해를 돕고자 실제 구동되는 코드 대신 의사 코드와 함께 설명을 진행합니다. 하지만 의사 코드에 매칭하는 실제 구동 가능한 소스 코드도 마련해 두었습니다. 각 소스 코드에 실제 구동되는 소스 코드의 위치를 덧붙여 놓았습니다.

 

1 리눅스에서는 파일 디스크립터(file descriptor) 혹은 fd라고 합니다.

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