전체 글 36

3. Service

지난번에 iocpCore를 만들어서 실행해보았고 이를 좀 더 편하게 관리하기 위해 Service라는 것을 도입했다.이에 맞춰 기존의 라이브러리를 조금 수정했다. Service.h#pragma once#include "NetAddress.h"#include "IocpCore.h"#include "Listener.h"#include enum class ServiceType : uint8{ Server, Client};//-------------// Service//-------------using SessionFactory = function;class Service : public enable_shared_from_this{public: Service(ServiceType type, NetAddress ..

8. Overlapped 모델 (이벤트 방식)

https://velog.io/@nittre/%EB%B8%94%EB%A1%9C%ED%82%B9-Vs.-%EB%85%BC%EB%B8%94%EB%A1%9C%ED%82%B9-%EB%8F%99%EA%B8%B0-Vs.-%EB%B9%84%EB%8F%99%EA%B8%B0 블로킹 Vs. 논블로킹, 동기 Vs. 비동기와 드디어 이해했다 속이 후련~velog.io먼저 동기 vs 비동기, 블로킹 vs 논블로킹에 대해서 확실히 알아보자.위 블로그에 잘 설명되어 있으니 참고하도록 하자. 동기, 비동기의 예시로 전화와 메일을 들 수 있다. 동기 : 전화를 통해서 질문에 대한 답을 받는 것(동시)비동기 : 메일을 통해서 답을 받는 것(보내고 신경쓰지 않음, 동시 X) 자주 사용되는 조합(?)은 (동기, 블로킹), (비동기, 논블로..

서버/네트워크 2024.10.11

2. IocpCore

본격적으로 IOCP를 구현해보자 IocpCore.h#pragma once// Iocp에 등록할 수 있는 객체//---------------// IocpObject//---------------class IocpObject{public: virtual HANDLE GetHandle() abstract; virtual void Dispatch(class IocpEvent* iocpEvent, int32 numOfByte = 0) abstract;};//-------------// IocpCore//-------------class IocpCore{public: IocpCore(); ~IocpCore(); HANDLE GetHandle() { return _iocpHandle; }; // 세션, 소켓 생..

1. Socket Utils

본격적으로 라이브러리를 쌓아올리는 과정이다. 먼저 소켓을 초기화하고 인자를 설정하는 등 소켓에 대한 내용이다. SocketUtils.h#pragma once#include "NetAddress.h"// 매핑을 해줘서 편하게 사용하기 위함//----------------// Socket Utils//----------------class SocketUtils{public: static LPFN_CONNECTEX ConnectEx; static LPFN_DISCONNECTEX DisconnectEx; static LPFN_ACCEPTEX AcceptEx;public: static void Init(); static void Clear(); static bool BindWindowsFunction(SOC..

7. WSAEventSelect 모델

이 모델에서는 Select 모델과 다르게 매번 전체 초기화를 할 필요가 없다.이벤트 객체와 소켓을 한 번 연동해주기만 하면 알아서 매핑을 해주기 때문에 잘 작동한다.#include "pch.h"#include "CorePch.h"#include #include "ThreadManager.h"#include #include #include #pragma comment(lib, "ws2_32.lib")void HandleError(const char* cause){ int32 errCode = ::WSAGetLastError(); cout 접속한 클라이언트가 있을 때 // connect -> 서버에 접속 성공했을 때 // send, sendto -> 요청한 데이터를 송신 버퍼에 복사했을 때 // recv..

서버/네트워크 2024.09.09

6. Select 모델

블로킹 소켓을 논블로킹으로 바꾼다고 다 좋은 것이 아니라는 것을 실습을 통해 알아보았다. 제대로 완료가 되지 않은 함수를 논블로킹 방식에서 그냥 리턴을 해주어서 예외처리를 해주어야 하고 그로 인해 무한루프를 돌며 CPU를 더 잡아먹는 불편함이 있었다. 그렇다면 논블로킹 모델을 사용하되 준비된 상태를 미리 파악하게 하면 어떨까하는 생각을 할 수 있는데 이가 바로 Select 모델의 컨셉이다. Server.cpp#include "pch.h"#include "CorePch.h"#include #include "ThreadManager.h"#include #include #include #pragma comment(lib, "ws2_32.lib")void HandleError(const char* cause){..

서버/네트워크 2024.09.05

5. 논블로킹(Non-Blocking) 소켓

우리가 지금까지 사용해왔던 소켓은 블로킹(Blocking) 방식 소켓이다. 우리가 통신을 하면서 사용했던 함수들이 언제 완료되는지 한 번 보자. accept -> 접속한 클라이언트가 있을 때 connect -> 서버에 접속 성공했을 때  send, sendto -> 요청한 데이터를 송신 버퍼에 복사했을 때 recv, recvfrom -> 수신 버퍼에 도착한 데이터가 있고, 이를 유저레벨 버퍼에 복사했을 때 이렇게 어떠한 행위가 끝날 때 비로소 함수가 종료된다. 함수가 실행되는 동안에는 대기를 해야한다는 뜻이다. 말그대로 블로킹(Blocking) 당하는 것이다. 게임을 한 번 생각해보자. 몇 천 명이 동시에 서버에 접속을 한다고 할 때 저렇게 대기를 하면 당연히 문제가 생길 수 밖에 없다. 그렇다고 접속을..

서버/네트워크 2024.09.03

4. 소켓 옵션

이번에는 간단하게 소켓 옵션을 설정하는 방법에 대해 알아보자. 소켓을 만들 때 기본적으로 커널에서 샌드, 리시브 버퍼(송수신 버퍼)가 만들어진다. 이 버퍼도 크기를 변경하는 등 프로그래머가 옵션을 설정할 수 있다. ::setsockopt();::getsockopt();이 두 함수를 통해 옵션을 설정하고 가져올 수 있다. 자세한 내용은 마이크로소프트 공식문서에 잘 나와있다. https://learn.microsoft.com/ko-kr/windows/win32/api/winsock2/nf-winsock2-setsockopt setsockopt 함수(winsock2.h) - Win32 appssetsockopt 함수(winsock2.h)는 모든 형식의 소켓과 연결된 소켓 옵션의 현재 값을 모든 상태로 설정합니..

서버/네트워크 2024.09.01

3. UDP 서버

TCP 서버를 알아보았으니 이제 코드를 수정해보면서 UDP 서버에 대해 알아보자. 일반적으로 TCP는 안정성이 높고 패킷의 도착순서를 보장하는 반면 UDP는 그렇지 못하지만 속도가 빠르고 바운더리(패킷과 패킷 사이의 경계)가 존재한다는 특징이 있다. 두 가지 전부 장단점이 있으므로 필요에 따라 적절한 프로토콜을 사용하면 된다. 채팅이나 아이템 거래 등과 같이 데이터가 유실되면 문제가 생기거나 패킷 수신의 순서가 중요한 경우 TCP를 사용하면 될 것이고, FPS와 같은 실시간 통신 게임이나 스트리밍 서비스와 같이 빠른 반응이 필요할 경우 UDP를 사용하면 될 것이다. DummyClient.cpp#include "pch.h"#include #include #include #include #pragma com..

서버/네트워크 2024.08.30

2. TCP 서버

간단한 서버의 구조를 만들어보았으니 이제 데이터를 보내고 받는 작업을 해보자. Dummyclient.cpp#include "pch.h"#include #include #include #include #pragma comment(lib, "ws2_32.lib")int main(){ // 윈속 라이브러리 초기화 (ws2_32 라이브러리 초기화) // 관련 정보가 wsaData에 채워짐 WSAData wsaData; if (::WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) return 0; // af : Address Family (AF_INET = IPv4, AF_INET6 = IPv6) // type : TCP(SOCK_STREAM) vs UDP(SOCK_DGRAM) // ..

서버/네트워크 2024.08.29