전체 글 118

TCP/UDP에 대한 이해

인터넷 프로토콜 기반 소켓의 경우 데이터 전송 방법에 따라 TCP(Transmission Control Protocol)/UDP(User Datagram Protocol)로 나뉜다. TCP/UDP는 TCP/IP 프로토콜 스택에 속해 있다. TCP/IP 프로토콜 스택은 4개의 계층으로 나뉘어 있는데 이를 통해 데이터 송수신 과정을 4개의 영역으로 나누어 구현했다는 것을 알 수 있다. 만약 TCP소켓을 생성해서 데이터를 송수신한다면 아래 그림에 있는 4개의 계층을 통해서 이루어 질 것이다. UDP소켓을 생성해서 데이터를 송수신한다면 아래 그림에 있는 계층들을 통할 것이다. 각 계층에 대해 먼저 알아보자. LINK 계층 LINK 계층은 물리적인 영역의 표준화에 대한 결과이다. LAN, WAN과 같은 네트워크 ..

공부/Server 2021.08.01

윈도우 기반 소켓 프로그래밍 필수 함수

// 성공 시 소켓 핸들, 실패시 INVALID_SOCKET 반환 #include SOCKET socket(int af, int type, int protocol) af : 프로토콜 체계 type : 소켓 타입 protocol : 호스트간 통신에 사용되는 프로토콜 // IP주소와 PORT번호 할당 // 성공 시 0, 실패 시 SOCKET_ERROR 반환 #include int bind(SOCKET s, const struct sockaddr* name, int namelen) s : socket함수로부터 할당 받은 소켓 핸들 name : IP주소, PORT번호를 할당한 sockaddr구조체 포인터. 보통 SOCKADDR_IN타입의 구조체에 IP주소와 PORT번호를 할당하고 SOCKADDR*로 형변환해서 ..

공부/Server 2021.07.31

C 입력 버퍼 비우기

C언어를 처음 공부하다보면 scanf로 입력을 받을 때 갑자기 입력을 안받고 넘어가버리는 경우가 있다. 예를 들어서 #include int main() { int num; char c; printf("숫자를 입력하세요 : "); scanf("%d", &num); printf("문자를 입력하세요 : "); scanf("%c", &c); return 0; } 이걸 실행하면 숫자만 입력받고 프로그램이 종료된다. 위의 경우 character를 입력받아야 할 부분에서 입력받지 않고 그냥 넘어가버리는 것을 확인할 수 있다. 숫자를 입력해야하는 부분을 문자열로 바꾸면 이번에는 문자열만 입력받고 character는 입력받지 않고 끝난다. #include int main() { char buf[30]; char c; p..

공부/C || C++ 2021.07.30

윈도우 기반 소켓 프로그래밍 시작하기(socket, protocol 개념 및 기본적인 함수 정리)

소켓이란? 물리적으로 연결되어 있는 호스트간 데이터 송수신을 가능하게 하는 매개체. Server측에서 필요한 함수들 WSAStartup(프로그램에서 요구하는 소켓 버전을 알리고, 해당 버전의 라이브러리 초기화) -> socket(socket 생성) -> bind(socket 주소 정보 할당) -> listen(socket을 연결 요청 받을 수 있는 상태로 만듬) -> accept(연결, 클라이언트로 부터 연결 요청이 있을 때 까지 대기) -> send(연결 요청이 있는 클라이언트에게 메세지를 보냄) -> closesocket(만약 연결을 종료할 것이라면 서버와 클라이언트 소켓을 닫는다) -> WSACleanup(윈속 라이브러리를 운영체제에 반환함으로써, 윈속 관련 함수 호출 불가) - listen 인자중..

공부/Server 2021.07.27

C++ 11 universal reference, std::forward

C++11부터 rvalue reference를 지원하는 것은 이미 공부해서 알고 있었다. 그런데 rvalue reference만 공부하면 자칫 '&&가 붙으면 무조건 rvalue reference다' 라는 오류에 사로잡힐 수 있다. 사실은 그게 아니다. &&가 붙어도 lvalue reference인 경우도 있기 때문이고 그것이 universal reference의 경우이다. universal reference는 &&로 선언된 변수나 인자가 타입 추론이 필요한 경우를 의미하며 이때는 rvalue/lvalue reference 모두 가능하다. 스콧 마이어씨의 글에는 다음과 같이 적혀있다. If a variable or parameter is declared to have type T&& for some de..

공부/C || C++ 2021.07.25

C++ 11 함수 객체(Functor)와 람다 표현식(Lambda Expression)

C++11부터는 람다식(Lambda Expression)이 지원된다. 람다가 무엇인지 알아보기 전에 함수 객체(Functor or Function object)에 대해서 알아야 한다. 함수 객체란 객체를 함수 호출 연산자 '()'를 오버로딩해서 함수처럼 호출될 수 있게한 객체를 의미한다. 예를 들면 아래와 같다. class functor { public: functor() {} ~functor() {} void operator()() { std::cout 를 이용한 역참조만 가능한 iterator) 타입을 의미하며 UnaryPredicate가 위에서 언급한 단항 술어를 의미한다. 참고로 remove_if함수는 실제로 element를 삭제하는게 아니라 술어 p라는 (삭제) 조건을 만족하지 않는 elemen..

공부/C || C++ 2021.07.24

C++ 템플릿 클래스/함수 헤더파일에 선언과 정의 모두 해줘야 하는 이유

Visual studio에서 클래스를 템플릿 클래스로 구현하기 위해서는 추가 > 클래스로 들어가서 아래 그림처럼 인라인이 되게, cpp파일 없이 헤더파일의 클래스 선언부분에 정의까지 해주는게 좋다. 템플릿 클래스(혹은 함수)를 헤더파일과 cpp파일로 다른 일반 클래스(함수)과 똑같은 방법으로 나눠서 선언, 구현을 따로 작성하면 오류가 뜬다. // Template.h #pragma once template class CTemplate { public: CTemplate(); ~CTemplate(); void Output(T t); }; // Template.cpp #include "Template.h" template CTemplate::CTemplate() { } template CTemplate::~C..

공부/C || C++ 2021.07.23

싱글턴 패턴(Singleton pattern)

싱글턴 패턴이란 단 하나만의 객체만을 만들고, 어디서든지 접근 가능할 수 있도록 하는 디자인 패턴이다. 예를 들어 scene들을 관리하는 SceneManger라는 클래스를 싱글톤으로 사용해서 하나의 객체만을 생성해서 관리하도록 했다. 이런 Manager 객체가 여러 개 만들어진다면, 다른 Manager 객체가 scene같은 resource에 어떤 변화를 주는지 파악하기 힘들기 때문에 싱글턴 패턴을 이용했다. 기본적으로 싱글톤 패턴은 다음과 같이 매크로로 설정해놓고 싱글턴을 사용해야 하는 클래스에서 매크로를 이용해 심플하게 사용할 수 있다. // Macro.h #define DECLARE_SINGLE(Type) \ private:\ static Type*m_pInst;\ public:\ static Typ..