목록C++/Windows 게임서버 (10)
나만의 작은 도서관

목차Overlapped 모델의 아쉬운 성능IOCP 모델의 특징IOCP 모델의 작동 과정IOCP 모델을 이용한 서버 만들기깃헙 코드참고 자료Overlapped 모델의 아쉬운 성능Overlapped 모델도 나름 성능이 준수하지만, 이전 글에서 알아봤듯, 이벤트 기반 / 콜백 기반 둘 다 성능을 떨어뜨리는 요인을 가지고 있었다. 물론, 그럼에도 Overlapped 모델은 준수한 성능을 보여주지만 게임서버에서 '준수한 성능' 정도로는 용납되지 않는다. 서버의 성능이 중요한 게임서버는 더 좋은 성능을 가진 모델이 있다면 그 모델을 써야할 것이다. 따라서, 오늘은 게임 회사에서 자주 사용할 정도로 성능이 좋은 IOCP 모델에 대해 알아보도록 하겠다.IOCP 모델의 특징IOCP 모델이란?IOCP는 I/O Comple..

목차Overlapped 입출력 방식의 사용Overlapped 모델의 두 가지 방식: 이벤트 기반, 콜백 기반Overlapped 모델을 이용한 서버 만들기Overlapped 모델의 문제점깃헙 코드참고 자료Overlapped 입출력 방식의 사용이전까지 Select 계열의 두 모델(Select 모델, WSAEventSelect 모델)을 정리했었다. 이번에는 윈도우에서 사용할 수 있는 Overlapped 입출력 방식을 활용한 소켓 모델을 정리해 보도록 하겠다. Overlapped 모델Overlapped 입출력 방식은 윈도우 운영체제에서 제공하는 고성능 파일 입출력 방식으로, 파일 입출력을 위해 제공되었다. 이를 소켓 입출력에도 사용할 수 있도록 만든 것이 Overlapped 모델이다. Overlapped?..

목차Select 모델의 문제점WSAEventSelect 모델의 특징WSAEventSelect 모델을 이용한 echo 서버 만들기WSAEventSelect 모델의 문제점깃헙 코드Select 모델의 문제점Select 모델은 기존의 블로킹/논블로킹 방식에서 소켓 작업이 진행될 수 없는 상황에서도 진행하려는 문제를 해결하기 위해 사용하였다. 하지만 1) 매 루프마다 fd_set에 소켓을 등록하고 select() 함수가 지우는 과정을 반복한다는 점, 2) select() 함수는 동기 방식을 따른다는 점과 같은 문제점이 있었다. Select모델의 장점을 가져가면서 위와 같은 문제점을 개선한 모델이 바로 WSAEventSelect 모델이다.WSAEventSelect 모델의 특징WSAEventSelect() 함수가 ..

목차이전 블로킹/논블로킹 방식의 문제점Select 모델의 특징Select 모델 동작 과정Select 모델을 이용한 echo 서버 만들기Select 모델의 문제점깃헙 코드이전 블로킹/논블로킹 방식의 문제점이전 블로킹/논블로킹 방식에는 서로 다른 이유로 서버의 성능을 저하시키는 구조적 문제가 있었다. (블로킹 방식에 대한 정리 글은 여기, 논블로킹 방식에 대한 정리 글은 여기를 참고하면 된다.) 각 방식의 구조적 문제는 다음과 같다.블로킹 방식: 소켓 함수(recv(), send() 등)를 호출하면, 해당 작업이 완료될 때까지 호출한 스레드는 무한정 기다려야 한다.논블로킹 방식: 소켓 함수(recv(), send() 등)를 호출하면, 해당 작업이 완료되었는지 반복적으로 확인해야 한다.결국 블로킹 방식을 사..

목차블로킹 방식의 문제점논블로킹 방식으로 echo 서버 코드 바꾸기결론깃헙 코드블로킹 방식의 문제점블로킹 함수를 호출 시, 함수 내 작업이 완료되기 전까지 호출자(caller)는 작업을 멈추고 대기하게 된다. 이러한 방식의 문제점은 함수의 작업을 하는동안 함수의 결과가 나오는 동안 처리해도 되는 작업들을 처리할 수 없다는 것이다. 기존의 TCP/UDP echo 서버에서 사용한 블로킹 함수는 다음과 같다.accept -> 접속한 클라가 있을 때까지 블로킹connect -> 서버에 접속 될 때까지 블로킹send, sendto -> 요청한 데이터를 송신 버퍼에 복사될 때까지 블로킹recv, recvfrom -> 수신 버퍼에 도착한 데이터가 있고, 이를 유저레벨 버퍼에 복사될 때까지 블로킹즉, 위 함수들을 실행..
목차소켓 옵션 get, setSO_KEEPALIVESO_LINGER::shutdown()SO_SNDBUF, SO_RCVBUFSO_REUSERADDRTCP_NODELAY소켓 옵션 get, set소켓 옵션은 클라이언트-서버가 통신할 때 발생하는 특정 상황을 어떻게 대응할 것인지 설정하기위해 사용한다. 설정된 옵션을 가져오기 위해서는 getsockopt() 함수를, 옵션을 설정하기 위해선 setsockopt() 함수를 사용하면된다. getsockopt() 함수와 setsockopt() 함수는 동일한 인자를 받으며 총 5개의 인자를 넣어줘야한다. setsockopt() 함수를 보면 다음과 같이 생겼다.int setsockopt( [in] SOCKET s, [in] int level, ..