Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

IOCP 실습

License

NotificationsYou must be signed in to change notification settings

jacking75/edu_cpp_IOCP

Repository files navigation

  • 코드에 버그가 있을 수 있다.(버그를 잡는 것도 공부!)
  • 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가 있어서 불 필요한 메모리 낭비가 발생함
  • 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)
  • 10 단계. 방 입장, 방 나가기, 방 채팅 구현하기 (ChatServer_03)

더 진행 한다면...

  • 11 단계. 최적화 하기
    • GetQueuedCompletionStatusEx 버전 사용하기
    • 서버에서 사용하는 설정을 입력 받기
    • 동적 할당을 최소화 하기
    • 링버퍼 구현 추가(덮어 쓰기 방지)
    • Lock 사용 범위를 줄이거나 좀 더 가벼운 Lock 사용하기
    • 더미 클라이언트로 테스트 하기
  • 12 단계. Network, Content, Host 각 레이어로 프로젝트 나누기
    • Network, Content는 각각 정적 라이브러리로 만든다.
    • Host는 콘솔 프로젝트. Network, Content 라이브러리를 사용한다.

참고 글 모음


[8]ページ先頭

©2009-2025 Movatter.jp