- 코드에 버그가 있을 수 있다.(버그를 잡는 것도 공부!)
- Modern C++을 적극적으로 사용하는 것을 추천한다.
- 'Tutorial/ChatServerWithLogger' 있는 프로젝트는 채팅 서버에 plog 라이브러리를 사용하고 있으며, Windows Event Log에 로그 데이터를 기록할 수 있다.
- Visual Studio 2022를 사용한다(하위 버전으로 변경해도 코드 변경은 없다)
- YOUTUBE
실습을 하기 전에 꼭 IOCP에 대해 학습을 한다.
IOCP는 오래된 기술로 서적에서 다루기도 했고, 특히 네이버에서 검색해도 많은 자료를 찾을 수 있다(네이버 검색하면 한글 자료)
- 1 단계. 가장 간단한 IOCP 서버. Echo 서버 코드 만들기
- IOCP API 동작에 대해서 이해할 수 있다.
- 2 단계. OverlappedEx 구조체에 있는
char m_szBuf[ MAX_SOCKBUF ]
를 stClientInfo 구조체로 이동 및 코드 분리하기- 앞 단계에는 OverlappedEx 구조체에
m_szBuf
가 있어서 불 필요한 메모리 낭비가 발생함
- 앞 단계에는 OverlappedEx 구조체에
- 3 단계. 애플리케이션과 네트워크 코드 분리하기
- IOCP를 네트워크 라이브러리화 하기 위해 네트워크와 서버 로직 코드를 분리한다.
- 연결, 끊어짐, 데이터 받음을 애플리케이션에 전달하기
- 4 단계. 네트워크와 로직(패킷 or 요청) 처리 각각의 스레드로 분리하기
- Send를 Recv와 다른 스레드에서 하기
- send를 연속으로 보낼 수 있는 구조가 되어야 한다.
- 5 단계. 1-Send 구현하기
- 버퍼에 쌓아 놓고, send 스레드에서 보내기.
- 6 단계. 1-Send 구현하기
- queue에 담아 놓고 순차적으로 보내기.
- 7 단계. 비동기 Accept 사용하기
- 6단계까지는 Accept 처리를 동기 I/O로 했다. 이것을 비동기I/O로 바꾼다. 이로써 네트워크 동작이 모두 비동기 I/O가 된다
- 6단계에서 이어서 기능을 구현한다.
- 8 단계. 채팅 서버 만들기 (ChatServer_01)
- 패킷 구조 사용하기, 로그인
- 9 단계. 로그인 때 Redis 사용하기 (ChatServer_02)
- C++에서 Redis를 사용하는 방법은 examples_cpp_redis를 참고한다.
- 10 단계. 방 입장, 방 나가기, 방 채팅 구현하기 (ChatServer_03)
- 11 단계. 최적화 하기
- GetQueuedCompletionStatusEx 버전 사용하기
- 서버에서 사용하는 설정을 입력 받기
- 동적 할당을 최소화 하기
- 링버퍼 구현 추가(덮어 쓰기 방지)
- Lock 사용 범위를 줄이거나 좀 더 가벼운 Lock 사용하기
- 더미 클라이언트로 테스트 하기
- 12 단계. Network, Content, Host 각 레이어로 프로젝트 나누기
- Network, Content는 각각 정적 라이브러리로 만든다.
- Host는 콘솔 프로젝트. Network, Content 라이브러리를 사용한다.