성댕쓰 똑똑한 생활

고정 헤더 영역

글 제목

메뉴 레이어

성댕쓰 똑똑한 생활

메뉴 리스트

  • 홈
  • 태그
  • 방명록
  • 분류 전체보기 (172)
    • 똑똑한 재테크 (1)
      • 올웨더 자산배분 (1)
    • 똑똑한 개발 (170)
      • Hazel 게임엔진개발 (0)
      • Algorithm 과 Data Structure (51)
      • C++ (18)
      • C# (8)
      • 개발로그 (0)
      • Image Processing (2)
      • C++ 게임개발 (60)
      • 컴퓨터 그래픽스 (10)
      • 수학 (13)
      • 영어 (8)

검색 레이어

성댕쓰 똑똑한 생활

검색 영역

컨텐츠 검색

전체 글

  • 네트워크 라이브러리 만들기(Session #2)

    2021.12.08 by 성댕쓰

  • 네트워크 라이브러리 만들기(Session #1)

    2021.12.06 by 성댕쓰

  • 네트워크 라이브러리 만들기(Server Service)

    2021.12.01 by 성댕쓰

  • 네트워크 라이브러리 만들기(Iocp Core)

    2021.11.29 by 성댕쓰

  • 네트워크 라이브러리 제작(Socket Utils)

    2021.11.27 by 성댕쓰

  • Completion Port 모델

    2021.11.19 by 성댕쓰

  • Overlapped모델 (콜백기반)

    2021.11.18 by 성댕쓰

  • Overlapped 모델(이벤트기반)

    2021.11.17 by 성댕쓰

  • WSAEventSelect 모델

    2021.11.16 by 성댕쓰

  • Select 모델

    2021.11.11 by 성댕쓰

네트워크 라이브러리 만들기(Session #2)

Session 클래스에 send 기능을 정의해보자. Session.h ... public: /* 외부에서 사용 */ void Send(BYTE* buffer, int32 len); ... private: /* 전송 관련 */ void RegisterConnect(); void RegisterRecv(); void RegisterSend(SendEvent* sendEvent); ... void ProcessSend(SendEvent* sendEvent, int32 numOfBytes); void HandleError(int32 errorCode); ... public: // TEMP BYTE _recvBuffer[1000]; ... Session.cpp ... void Session::Send(BYTE* ..

똑똑한 개발/C++ 게임개발 2021. 12. 8. 21:34

네트워크 라이브러리 만들기(Session #1)

이제 Listener에서 client session 정보를 세팅하고 receive event를 register하는 부분부터 만들어 보자. Session.h #pragma once #include "IocpCore.h" #include "IocpEvent.h" #include "NetAddress.h" /*---------------- Session ----------------*/ class Session : public IocpObject { friend class Listener; friend class IocpCore; friend class Service; public: Session(); virtual ~Session(); public: void Disconnect(const WCHAR* cau..

똑똑한 개발/C++ 게임개발 2021. 12. 6. 23:05

네트워크 라이브러리 만들기(Server Service)

지난 시간에 작성한 코드에는 문제가 하나 있다. GetQueuedCompletionStatus 키값으로 복원한 포인터가 살아있는 상태인지 체크를 하지 않고 있다. 엉뚱한 주소에 접근하여 오류를 만들 여지가 있다. 이번시간에는 이 오류를 해결해보자. 키값으로 사용하는 IocpObject를 기존에 구현한 refcount를 이용하여 관리하는 방법이 있다. 이 방법의 단점은 외부에서 shared_ptr로 IocpObject를 만들었을 경우 refcount가 각각 관리되는 점이다. 다른 방법은 iocpEvent에 iocpObject shared_ptr을 멤버변수로 관리하는 방법이다. 이 방법을 코드로 구현해보자. shared_ptr을 좀 더 편하게 사용하기 위해 using문을 추가한다. Types.h ... //..

똑똑한 개발/C++ 게임개발 2021. 12. 1. 22:29

네트워크 라이브러리 만들기(Iocp Core)

네트워크 라이브러리에서 사용할 Iocp Core 부분을 만들어보자. IocpCore.h #pragma once /*---------------- IocpObject ----------------*/ class IocpObject { public: virtual HANDLE GetHandle() abstract; virtual void Dispatch(class IocpEvent* iocpEvent, int32 numOfBytes = 0) abstract; }; /*---------------- IocpCore ----------------*/ class IocpCore { public: IocpCore(); ~IocpCore(); HANDLE GetHandle() { return _iocpHandle; ..

똑똑한 개발/C++ 게임개발 2021. 11. 29. 17:12

네트워크 라이브러리 제작(Socket Utils)

이전에 학습한 네트워크 기본 지식 + 함수를 바탕으로 네트워크 라이브러리를 제작해보자 CorePch.h ... #include #include #include #pragma comment(lib, "ws2_32.lib") ... 먼저 앞으로 사용할 매크로 함수를 정의하자. size 와 array의 len을 반환하는 함수다. Types.h ... #define size16(val) static_cast(sizeof(val)) #define size32(val) static_cast(sizeof(val)) #define len16(arr) static_cast(sizeof(arr)/sizeof(arr[0])) #define len32(arr) static_cast(sizeof(arr)/sizeof(arr[0..

똑똑한 개발/C++ 게임개발 2021. 11. 27. 14:19

Completion Port 모델

Completion Port 모델을 줄여서 IOCP라고 한다. 많은 MMORPG 서버에서 사용하는 네트워크 IO모델이다. 기존 모델과 다른 점은 Block하는 부분이 없고 멀티 Thread에서 처리가 용이하다는 것이다. GameServer.cpp const int32 BUFSIZE = 1000; struct Session { SOCKET socket = INVALID_SOCKET; char recvBuffer[BUFSIZE] = {}; int32 recvBytes = 0; }; enum IO_TYPE { READ, WRITE, ACCEPT, CONNECT }; struct OverlappedEx { WSAOVERLAPPED overlapped = {}; int32 type = 0; // read, wri..

똑똑한 개발/C++ 게임개발 2021. 11. 19. 12:24

Overlapped모델 (콜백기반)

지난 이벤트 기반 overlapped 모델은 이벤트 받을 수 있는 개수가 64개로 제한되어 있었다. 이번에 알아볼 콜백기반 overlapped 모델은 이벤트 기반 모델의 단점을 해결한 모델이다. GameServer.cpp const int32 BUFSIZE = 1000; struct Session { WSAOVERLAPPED overlapped = {}; SOCKET socket; char recvBuffer[BUFSIZE] = {}; int32 recvBytes = 0; }; void CALLBACK RecvCallback(DWORD error, DWORD recvLen, LPWSAOVERLAPPED overlapped, DWORD flags) { cout 요청한 데이터를 송신 버퍼에 복사했을 때 //..

똑똑한 개발/C++ 게임개발 2021. 11. 18. 22:08

Overlapped 모델(이벤트기반)

Select 모델과 WSAEventSelect 모델은 non-blocking sync 방식이었다. 즉 함수 내부 로직이 완료될때까지 기다리지 않지만 함수 호출을 하면 함수 실행이 되는 방식이었다. 이번에 알아볼 Overlapped 모델은 async 방식이다. 함수 호출을 하면 다른 시점에 함수가 실행될 가능성이 있다. GameServer.cpp const int32 BUFSIZE = 1000; struct Session { SOCKET socket; char recvBuffer[BUFSIZE] = {}; int32 recvBytes = 0; WSAOVERLAPPED overlapped = {}; }; int main() { WSAData wsaData; if (::WSAStartup(MAKEWORD(2,..

똑똑한 개발/C++ 게임개발 2021. 11. 17. 22:19

WSAEventSelect 모델

select 모델은 ::select(...)에서 block되는 구조였다. ::WSAEventSelect(...)를 통해 해당 함수 호출은 non-blocking으로 하고 이벤트가 발생하면 통보를 받는 방식으로 구현할 수 있다. 이를 WSAEventSelect 모델이라고 한다. GameServer.cpp const int32 BUFSIZE = 1000; struct Session { SOCKET socket; char recvBuffer[BUFSIZE] = {}; int32 recvBytes = 0; int32 sendBytes = 0; }; int main() { WSAData wsaData; if (::WSAStartup(MAKEWORD(2, 2), &wsaData)) return 0; // 블록킹(B..

똑똑한 개발/C++ 게임개발 2021. 11. 16. 22:32

Select 모델

지난 글에서 논블록킹 소켓 통신이 불필요한 무한 반복문을 돌며 CPU자원을 낭비하는 단점이 있다는 것을 알게 되었다. 단점을 해결하기 위해 여러 방법이 존재하는데 이번엔 Select 모델에 대해 알아보자. Select 모델은 socket 함수를 실행할 준비가 됐는지 확인하고 소켓 통신을 진행하는 방식이다. 블록킹, 논블록킹 모든 경우에 사용할 수 있다. 논블록킹 통신에 사용할 경우 무한 반복문을 돌며 함수를 실행하는 낭비를 줄일 수 있다. Select 모델이라고 이름 붙여진 이유는 select 함수가 핵심 역할을 하기 때문이다. ::select함수를 실행하면 read, write 또는 예외 소켓 통신이 준비 될 때까지 기다린다. 그리고 그중 하나라도 준비되면 리턴하는데 select함수 매개변수로 받은 s..

똑똑한 개발/C++ 게임개발 2021. 11. 11. 22:46

추가 정보

인기글

최신글

페이징

이전
1 ··· 6 7 8 9 10 11 12 ··· 18
다음
TISTORY
성댕쓰 똑똑한 생활 © Magazine Lab
페이스북 트위터 인스타그램 유투브 메일

티스토리툴바