공부 114

윈도우 기반 소켓 프로그래밍 시작하기(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..

C++ static variable, static member variable, static member function

C++에서는 static 키워드란 것이 있다. static의 의미는 정적이다는 것인데 이것이 변수에도 붙을 수도 있고, 함수에도 붙을 수 있다. 그리고 클래스 내에서 static은 또 다른 의미를 갖는다. static에 관한 내가 잊고 있었거나, 처음 알게된 사실들을 정리해보고자 한다. 우선 static변수의 특징부터 복습해보자. static변수는 전역 변수와 지역 변수로서의 특징을 모두 갖는다. 1. 전역 변수처럼 프로세스가 시작할 때(main 함수 시작 전에) 메모리가 할당되고 프로그램이 종료될 때 까지 메모리가 할당된 채로 남아있다. 지역 변수는 해당 블록이 끝나면 파괴되는 것과는 대비된다. 2. static 지역 변수가 블록 안에서 선언된 것이면 그 블록 밖에서는 사용이 불가능하다. 신기하게 메모..

공부/C || C++ 2021.07.23

C++ 연산자 오버로딩(Operator overloading)

C++에서 연산자 오버로딩이란 C에서 정의하고 있는 연산자( +, -, /, *, ++, -- 등)의 동작을 다시 정의하는 것을 의미한다. 참고로 C언어는 연산자 오버로딩을 지원하지 않는다. C언어에서 정의하고 있는 연산자의 동작이란 우리가 평소에 사용하는 것과 같다. 예를 들어 +, - 연산자들은 숫자에 대해서만 정의되어 있다. 하지만 C++에서는 연산자 오버로딩을 통해 클래스 객체끼리도 그런 연산들이 가능하게 해준다. 형태는 간단하게 반환타입 operator 연산자 ( ) 방법은 2가지가 있다. 1. 멤버 함수에 의한 연산자 오버로딩 2. 전역 함수에 의한 연산자 오버로딩(클래스 정의에서 friend 선언 필요) 먼저 멤버 함수를 이용해서 연산자 오버로딩을 하는 경우를 보자 class Point { ..

공부/C || C++ 2021.07.22

함수 호출 규약(Calling convention)

함수 호출 규약이란 함수를 호출할 때 규칙이다. 함수 호출 규약이 무엇인지 알기 전에 알아야하는 용어가 몇가지 있다. 먼저 prologue/epilogue이다. 아래 첫번째 그림에서 볼 수 있듯이 함수 호출전에 이전 프레임 포인터 레지스터(ebp)를 스택에 백업해두고, 프레임 베이스 포인터를 ebp에 저장해두는 것을 부분을 prologue라고 한다. 두번째 그림 처럼 "ebp + offset" 이런식으로 보통 함수에 넘겨준 인자나 return address에 쉽게 접근할 수 있다. 호출된 함수가 끝나면 해당 함수에 대한 스택은 소멸되어야 하므로 esp를 프레임 베이스 포인터로 복귀시키고, ebp는 이전 프레임의 베이스 포인터를 다시 받고 return address로 점프하는 동작을 합쳐서 epilogue..

공부/C || C++ 2021.07.20