목록분류 전체보기 (162)
Coding Memo
본 포스팅은 인프런에 등록되어 있는 Rockiss 님의 강의를 보고 간단하게 정리한 글입니다. socket을 blocking모드와 non-blocking 모드로 사용할 때, 장단점이 각각 존재했다. blocking socket은 조건이 만족되지 않아서 blocking되는 상황이 발생하고 non-blocking socket은 조건이 만족되지 않아서 불필요하게 반복체크하는 상황이 발생한다. 그렇다면 반복체크를 계속하지 않고 non-blocking으로 해당 함수의 return 값을 받아서 사용할 수 없을까? 이에 대한 해답은 여러가지가 있는데, 그 중 하나가 select를 이용하는 것이다. select는 non-blocking(synchronous) 수행을 위해 여러개의 소켓을 관리하고 return 가능한 소..
본 포스팅은 인프런에 등록되어 있는 Rockiss 님의 강의를 보고 간단하게 정리한 글입니다. 지금까지 했던 socket은 blocking으로 작동하는 소켓이었다. accept : 접속한 클라이언트가 있을 때 connect : 서버가 접속에 성공했을 때 send, sendto : 요청한 데이터를 sendBuffer에 복사 했을 때 recv, recvfrom : recvBuffer에 도착한 데이터가 존재하고, 이를 유저레벨 buffer에 복사했을때 다음 코드가 실행이 된다. 다시 말해, 위 조건이 실행되거나 에러가 발생할 때까지 다음 코드 실행은 block되는 것이다. 곰곰히 생각해보면 서버를 실행할 때 어떤 송수신이나 connect에 대한 응답을 무한히 대기하여 block된 상태로 있을 수는 없을 것이다..
본 포스팅은 인프런에 등록되어 있는 Rockiss 님의 강의를 보고 간단하게 정리한 글입니다. socket을 만들고 이 소켓에 대한 여러가지 세팅을 해줄 수 있다. 다음의 함수를 이용한다. setsockopt() int setsockopt( [in] SOCKET s, [in] int level, [in] int optname, [in] const char *optval, [in] int optlen ); SOCKET s 설정을 할 타켓 소켓 int level 옵션이 정의될 레벨 (SOL_SOCKET 이용) int optname 설정할 옵션 이름 const char* optival 설정할 옵션의 값 int optlen 설정할 옵션의 값의 크기 char*로 옵션의 값을 받는 이유는 옵션에 대한 값을 여러가지..
본 포스팅은 인프런에 등록되어 있는 Rockiss 님의 강의를 보고 간단하게 정리한 글입니다. UDP(User Data Protocol)은 네트워크 5계층에서 Transmission Layer에 해당하는 프로토콜 중 하나의 방식이다. UDP는 다음과 같은 특징이 있다. 1. 연결을 위한 별다른 경로가 없다. 2. 송수신 여부를 확인하지 않는다. 3. 데이터 손실에 대한 조치가 없다. 4. 데이터 그램 단위로 데이터를 전송한다. 5. 속도가 상대적으로 빠르다. (TCP에 비해) 좀 더 자세히 보자면 1. 연결을 위한 즉, listening 할 소켓이 필요가 없다. 대신 connecting UDP가 있다. (즐겨찾기와 비슷) 2. 직접적인 연결을 송수신 자간에 따로 하지 않고 송수신 여부도 따로 확인하지 않..
본 포스팅은 인프런에 등록되어 있는 Rockiss 님의 강의를 보고 간단하게 정리한 글입니다. TCP (Transmission Control Protocol)은 네트워크 5계층에서 Transport Layer에 해당하는 송수신 간 전송 방식 중 하나이다. 보통은 UDP와 대조되어 사용된다. TCP는 다음과 같은 특징을 가지고 있다. 1. 데이터 전송 경로 외에도, 호스트 간 연결이 따로 필요하다. 2. 송수신데이터에 대한 데이터의 경계(Boundary)가 없다. 3. 전송 순서가 보장된다. 4. 전송 시, 데이터 손실이 발생할 경우 다시 전송한다. (신뢰성이 있다.) 5. 데이터를 받을 호스트가 여건이 안될 경우 데이터를 일부만 전송한다. (흐름/혼잡제어) 6. 위 특징에 따라 고려할 것이 많으니 속도가..
본 포스팅은 인프런에 등록되어 있는 Rockiss 님의 강의를 보고 간단하게 정리한 글입니다. 소켓을 이용해서 간단하게 서버와 클라이언트 접속을 해보도록 하자. 소켓 프로그래밍을 위해서는 다음과 같은 라이브러리와 헤더가 추가되어야 한다. (아래 문서에도 나와있다.) (https://learn.microsoft.com/ko-kr/windows/win32/winsock/creating-a-basic-winsock-application) #include #include #include #pragma comment(lib, "ws2_32.lib") MS에서 제공하는 윈도우 소켓을 이용한다. 자세한 문서는 아래에 있다. https://learn.microsoft.com/ko-kr/windows/win32/wins..
본 포스팅은 인프런에 등록되어 있는 Rockiss 님의 강의를 보고 간단하게 정리한 글입니다. 다음과 같은 클래스가 있다고 가정해보자. class Player { public: Player() {} virtual ~Player() {} }; class Knight : public Player { public: Knight() { } }; class Mage : public Player { public: Mage() { } }; class Archer : public Archer { public: Archer() {} }; 상위 클래스인 Player로 관리를 해줄 것인데, 중간중간 관리 리스트에 있는 Knight와 Mage를 사용하고 싶을 때가 있을 것이다. 그럴때, 다음과 같이 캐스팅을 통해 객체를 가져..
본 포스팅은 인프런에 등록되어 있는 Rockiss 님의 강의를 보고 간단하게 정리한 글입니다. 동일한 클래스를 모아서 관리하는 Object Pool을 구현 메모리 풀과 비슷한 방식으로 작동한다. 그러나 메모리 크기에 따라 공간을 나누었던 메모리 풀과 다르게 타입 하나에 하나의 풀을 할당하여 사용할 것이다. 메모리 관련 오류가 발생했을 때 어떤 클래스에서 오류가 난 것인지 알 수 있는 장점이 있다. Object Pool private 맴버로 할당 크기와 타입별 사용할 메모리 풀을 static으로 선언한다. template class ObjectPool { public: static Type* Pop(Args&&... args) {} static void Push(Type* obj) {} private: s..