[C++] SendBuffer
·
Study/C++ & C#
SendBuffer는 내용이 많아서 과정을 분할해 올린다. 먼저 이번엔 SendBuffer 자체의 구현에 대해 다룬다. 1. SendBuffer 클래스 작성 RecvBuffer처럼 클래스를 만들어서 관리한다. #pragma once // 송신 버퍼도 WSASend 중에 없어지거나 하면 안되기 때문에 // 레퍼런스 카운팅이 이루어져야 한다 class SendBuffer : enable_shared_from_this { public: SendBuffer(int32 bufferSize); ~SendBuffer(); BYTE* Buffer() { return _buffer.data(); } int32 WriteSize() { return _writeSize; } int32 Capacity() { return s..
[C++] RecvBuffer
·
Study/C++ & C#
지금까지 수신버퍼를 임시로 단순 배열로 만들어 사용했었다. 하지만 정말 임시적인 방편이고 제대로 된 처리를 위해 버퍼 클래스를 만들 것이다. 송신버퍼는 내용이 많으므로 별도의 글로 정리할 것이다. 1. 버퍼 클래스 작성 일단 기존 세션 헤더에 있던 버퍼 관련 내용은 다 날리고 아래와 같이 수신버퍼를 선언한다. // Session.h //... private: weak_ptr_service; SOCKET_socket = INVALID_SOCKET; NetAddress_netAddress = {}; Atomic_connected = false; private: USE_LOCK; /* 수신 관련 */ RecvBuffer_recvBuffer; /* 송신 관련 */ private: /* IocpEvent 재사용 ..
[C++] Session
·
Study/C++ & C#
이제 세션이 본격적으로 역할을 할 수 있도록 고쳐나간다. 세션 클래스에 필요한 것들을 만들어 두고, 세션에서 많은 일들을 할 수 있게 할 것이다. 단계를 나눠서 진행한다. 1. 연결 및 수신 1-1. 클래스 내용 추가 추가된 부분에 대해서만 표시한다. #pragma once #include "IocpCore.h" #include "IocpEvent.h" #include "NetAddress.h" class Service; class Session : public IocpObject { // 자유롭게 꺼내쓸 수 있도록 허락 friend class Listener; friend class IocpCore; friend class Service; public: // 생/소멸자 // 외부에서 사용할 함수들 pu..
블로그 이름 변경
·
Others
뭐 거창한 이유는 아니고... 기존의 이름이 큰 의미가 없는 듯하기도 하고, E드라이브에 필요한 모든걸 저장을 하다 보니 그냥 적당히 바꿨다. 이름이야 언제든지 바뀔 수 있는 것 아니겠나...
[C++] Service
·
Study/C++ & C#
오늘도 최대한 메모해 보자. 1. Service란? 여기서 서비스란 흩어져 있는 여러 기능들을 한 곳에 모아둬, 보다 편하게 사용할 수 있게 한 집합이다. 언제 리스너/송신/수신 오브젝트를 일일이 만들고 설정한단 말인가? 이전에 했던 일련의 작업들이 서비스에 포함된 상태로 동작할 것이다. 라이브 서비스에선 모든 기능을 하나의 서버에 두는 것이 아니라, 목적에 맞게 서버를 분산해 운용한다. 서버끼리 붙어야 할 일도 생길 수 있기 때문에 이에 대응해야 한다. 세션이 서버일 수도 있고 클라이언트일 수도 있기 때문에, Service라는 클래스를 두어 정책을 구분해 운용하기로 한 것이다. 1. 문제 해결 부터 본격적으로 Service에 대한 구현에 들어가기 전에 이전 과정의 문제에 대한 수정이 필요하다. 우린 C..
[C++] IOCP Core
·
Study/C++ & C#
여기서부턴 좀 더 제대로 흐름을 이해할 필요가 있는 것 같다. 아마 앞으로를 위해서도 중요할 것이다. 그런데 어떻게 정리해야 깔끔할지도 모르겠다. 그만큼 난이도가 올라간 것 같다. 1. 클래스 작성 일단 다시 Completion Port의 동작 과정에 대해 살펴보자. CP 핸들을 만든다 CP 핸들에 소켓을 등록한다 IO 함수를 건다 GetQueuedCompletionStatus()가 감지 일을 처리하고 다시 IO 함수를 건다 였다. CreateIoCompletionPort() 함수가 2가지 일을 한방에 처리하는 것은 정말 인상적이었다. 이제 이걸 하나의 작은 라이브러리의 형태로 구현해 보자. 1-1. IocpCore 이번 메모의 주제에 맞는 핵심 클래스이다. // IocpCore.h class IocpO..
[C++] Socket util 클래스 작성
·
Study/C++ & C#
이제 본격적인 네트워크 라이브러리 작성에 들어간다. 공부한 내용을 까먹기 전에 최대한 메모해 보자. 1. 클래스의 필요성 지난 시간까지 소켓에 관해 작성했던 코드들 중 일부 살펴보자. WSAData wsaData; if (::WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) return 0; SOCKET clientSocket = ::socket(AF_INET, SOCK_STREAM, 0); if (clientSocket == INVALID_SOCKET) return 0; u_long on = 1; if (::ioctlsocket(clientSocket, FIONBIO, &on) == INVALID_SOCKET) return 0; SOCKADDR_IN serverAddr; ::..
[C++] Completion Port Model
·
Study/C++ & C#
대망의 IOCP. 이번에도 최대한 기억을 짜내서 메모해 보자. 1. Completion Model의 개념 Overlapped 모델을 생각해 보자. 이 모델 APC큐가 스레드마다 있었다. 따라서 어찌 보면 스레드가 낭비되는 느낌이 있었는데, IOCP는 그렇지 않다. APC큐가 스레드마다 있지 않고 딱 1개가 있다. 중앙에서 관리하는 APC큐라는 느낌으로 보면 딱 맞을 것이다. Alertable Wait 상태로 들어가기 위해 GetQueuedCompletionStatus()라는 함수를 사용해야 한다. 여기까지만 보면 Overlapped 모델과 흐름상의 큰 차이는 없지만, 결과적으로 IOCP는 스레드와의 궁합이 매우 좋기 때문에 매우 성능이 좋은 모델이라 할 수 있다. 1-1. 사용할 함수 CreateIoCo..
[C++] Overlapped Model
·
Study/C++ & C#
이 모델은 이전의 Select 계열의 모델보다 더 한방에 이해하기 어려운 것 같다. 제대로 이해하고 쓰는 것이 아니라, 잊어먹기 전에 최대한 메모해 둔다는 느낌으로 작성한다. Overlapped 모델엔 이벤트 기반과 콜백 기반 2가지 방식이 있다. 이벤트 기반에 대해서 먼저 작성한다. 1. Overlapped 모델의 개념 Overlapped 모델은 기본적으로 비동기와 논 블로킹이 조합된 형태의 모델이다. 반면에 이전의 Select 계열 모델들은 논 블로킹이었지만 비동기는 아니었다. Ovelapped 모델은 아래와 같이 동작한다. Overlapped 모델은 미리 함수를 걸어(실행) 둔다. WSARecv, WSASend 함수가 성공했는지 확인 2-1. 성공했다면 결과를 가져와서 처리 2-2. 실패했다면 그 ..
[C++] WSAEventSelect Model
·
Study/C++ & C#
이전 Select Model에 이어 WSAEventSelect Model에 대해 공부해 보자. 1. WSAEventSelect 모델의 개념 WSAEventSelect함수가 핵심이 되는 모델이다. 소켓과 관련한 네트워크 이벤트를 이벤트 객체를 통해 감지한다. 1.1. 이벤트 객체 관련 객체 관련해서 사용하는 함수는 아래와 같다. WSACreateEvent 이벤트 객체를 생성한다. Manual-Reset, Non-Signaled 상태에서 시작한다. WSACloseEvent 이벤트 객체를 삭제한다. WSAWaitForMultipleEvents 이벤트 발생을 감지한다. WSAEnumNetworkEvents 구체적으로 어떤 이벤트가 일어났는지를 확인한다. 1.2. 소켓 - 이벤트 객체 연동 WSAEventSele..