전체 글 269

[TCP/IP 소켓 프로그래밍] (11-2) 다중 접속 서버 - 레벨 트리거/엣지 트리거

출처 : 열혈 TCP/IP 소켓 프로그래밍 윤성우 저 epoll 기반 이벤트 발생 이벤트 발생 감지(트리거)에 대한 기준을 두가지로 변경할 수 있다. 1. 레벨 트리거: 입력버퍼에 데이터가 남아있는 동안에 계속해서 이벤트가 등록된다. 2. 엣지 트리거: 입력버퍼에 데이터가 처음 수신될 때 이벤트가 등록된다. 기본 트리거 방식은 레벨 트리거이다. - 엣지 트리거 설정 struct epoll_event; event.events = EPOLLIN(수신 데이터 감지) | EPOLLET(엣지 트리거); - 소켓 속성 변경 엣지 트리거 방식의 특성상 블로킹 방식으로 동작하는 read & write 함수의 호출은 서버를 오랜 시간 멈추는 상황으로 이어질 수 있다. 엣지 트리거 방식에서는 소켓을 논블로킹 모드에서 re..

[TCP/IP 소켓 프로그래밍] (11-1) 다중 접속 서버 - epoll

출처 : 열혈 TCP/IP 소켓 프로그래밍 윤성우 저 Epoll --- select 기반의 멀티 플렉싱 서버가 느릴 수 있는 이유 1. select 함수 호출 이전에 모든 관찰 대상을 초기화하여 전달해야 한다. char buf[BUF_SIZE]; int fd_max = serv_sock, fd_num; struct timeval timeout; while(1) { // 관찰 대상 초기화 cpy_reads = reads; timeout.tv_sec = 5; timeout.tv_usec = 5000; // ... select 호출 } 2. select 함수 호출 이후 모든 관찰 대상에 대해 반복문을 통해 어떤 관찰 대상이 변했는지 체크하고 그에 따른 처리를 해줘야 한다. // 모든 관찰 대상을 체크 for(..

[TCP/IP 소켓 프로그래밍] (10) 멀티 캐스트와 브로드 캐스트

출처 : 열혈 TCP/IP 소켓 프로그래밍 윤성우 저 멀티 캐스트 방식의 데이터 전송 UDP 기반 데이터 전송으로 특정 멀티 캐스트용 IP 그룹에 속해있는 다수의 호스트로 데이터를 전송할 수 있다. 멀티 캐스트 방식을 이용하면 단 한번에 데이터 전송으로 다수의 호스트에게 데이터를 전송할 수 있다. 멀티캐스트의 데이터 전송방식과 멀티캐스트 트래픽 이점 멀티캐스트 서버는 특정 멀티캐스트 그룹을 대상으로 데이터를 딱 한번 전송한다. 한번 전송하더라도 그룹에 속하는 클라이언트는 모두 데이터를 수신한다. 멀티캐스트 그룹의 수는 IP 주소 범위 내에서 얼마든지 추가 가능하다. 특정 멀티캐스트 그룹으로 전송되는 데이터를 수신하려면 해당 그룹에 가입하면 된다. 멀티캐스트 그룹이란 IP주소의 D 클래스 범주에 속하는 주..

[TCP/IP 소켓 프로그래밍] (9) TCP 긴급 메세지

출처 : 열혈 TCP/IP 소켓 프로그래밍 윤성우 저 Linux에서 read/write 함수외에 윈도우에도 존재하는 send와 recv함수를 사용할 수 있다. - send 함수 ssize_t send(int sockfd, const void* buf, size_t nbytes, int flags); - recv 함수 ssize_t recv(int sockfd, void* buf, size_t nbytes, int flags); read/write와의 차이점은 소켓 옵션을 flags로 전달가능한데, 사용가능한 옵션의 예는 다음과 같이 있다. MSG_OOB: 긴급 데이터(Out-of-band data)의 전송을 위한 옵션 MSG_PEEK: 입력 버퍼에 수신된 데이터의 존재 유무를 확인을 위한 옵션 MSG_D..

[TCP/IP 소켓 프로그래밍] (8) 다중 접속 서버 - 멀티 플렉싱 기반 select 서버

출처 : 열혈 TCP/IP 소켓 프로그래밍 윤성우 저 멀티 프로세스 기반 서버의 단점 프로세스를 복사할 때마다 비용이 들고 독립적인 메모리로 상호간 데이터를 주고 받기 위해서는 Pipe라는 운영체제 자원을 사용해야한다. 다수의 프로세스를 생성하지 않으면서 클라이언트에게 서비스를 할 수 있는 방법 중 "멀티 플렉싱" 기술을 사용하면 다중 사용자에게 하나의 프로세스에서 서비스를 제공할 수 있다. 멀티 플렉싱 하나의 통신 채널을 통해 둘 이상의 데이터를 전송하는데 사용하는 기술 select 함수의 기능과 호출 순서 멀티 플렉싱 기술에서 여러 소켓/파일 디스크립터를 동시에 관찰하기 위해 사용하는 함수, select가 있다. select 함수는 1. 수신한 데이터를 지니고 있는 소켓이 있는가 2. 블로킹 되지 않..

[C++] 형 변환 (2) dynamic_cast / static_cast / reinterpret_cast / const_cast

C++ 스타일의 클래스 간 명시적 형변환을 알아본다. dynamic_cast / static_cast / reinterpret_cast / const_cast dynamic_cast(expression) dynamic_cast는 런타임에 expression의 타입을 확인하여 type-id로 형 변환이 가능한지 검사한다. 참조나 포인터에 대해서만 사용가능하다. RTTI, 런타임 형식 정보를 사용하기 때문에 다른 캐스팅보다 느리다. 안전한 캐스팅을 제공하며 캐스팅이 실패하면 0 포인터, 즉 nullptr를 반환한다. 참고 : docs.microsoft.com/ko-kr/cpp/cpp/dynamic-cast-operator?view=msvc-160 - 업 캐스팅 // dynamic_cast_1.cpp // c..

Advanced C++ 2021.04.01

[C++] 형 변환 type casting

자료형과 관련된 용어 Type expression = ActualType inst; 위 expression이라는 변수를 선언했을 때, expresssion을 표현식이라하고 expression을 선언하기 위해 사용한 타입을 표현식의 타입이라하고 실제 인수가 가리키는 타입을 실제 타입이라고 한다. Implicit Conversion 암묵적 형변환 컴파일러가 자료를 재해석하여 자동적으로 자료형을 변환해주는 것을 의미한다. 변환될 타입의 범위가 실제 타입보다 작은경우 (double (8)-> float(4), unsigned long long -> long/int) narrow conversion 좁은 범위의 변환이 일어나고 컴파일러 경고가 나타난다. int a = 1.0f; // float -> int : n..

Advanced C++ 2021.04.01

[TCP/IP 소켓 프로그래밍] (7-3) 다중 접속 서버 - 프로세스 간 통신 IPC

출처 : 열혈 TCP/IP 소켓 프로그래밍 윤성우 저 fork로 복제된 자식 프로세스는 부모 프로세스와 완전히 독립적인 메모리 공간을 가지고 있기 때문에 자료를 공유할 수 있는 방법이 쉽지 않다. PIPE 따라서 프로세스 간 자원을 주고 받기 위해서는 파이프라는 것을 생성해야한다. 파이프는 운영체제 자원으로 통신을 위한 메모리 공간을 가진다. 두 프로세스는 파이프의 메모리를 통해 자원을 주고 받을 수 있다. - 운영체제 지원이 필요한 이유 두 프로세스는 메모리를 공유하지 않으므로, 즉 공유 공간이 없으므로 두 프로세스가 동시에 접근 가능한 메모리 영역을 할당하기 위해 운영체제의 도움이 필요하다. int pipe(int filedes[2]); 성공 시 0, 실패 시 -1 반환 filedes[0] 파이프로부..

[자료 구조] 알아야 할 자료구조 AVL Tree

AVL (Adelson-Velsky and Landis) Tree 이진 자가 균형 트리 - 균형 트리 이진 탐색 트리의 경우 삽입이나 삭제 이후 서브 트리간 불균형 문제가 발생할 수 있다. 이는 추후 탐색 시간을 저하시키기 때문에 균형을 맞추는 것이 필요하다. - 높이의 정의 한 노드의 높이는 노드를 루트로하는 서브 트리에서 말단 리프노드까지 도달하는 경로 중 가장 긴 경로를 의미한다. 재귀적 표현으로 높이를 구한다면 다음과 같다. height := max(height(left_child), height(right_child)) + 1 위 계산을 편리하게 하기위해 Null 노드의 높이를 -1로 설정한다. height = -1 if (root == NULL) - AVL Tree의 구조 AVL tree는 스..

C++/자료 구조 2021.03.31

[자료 구조] 알아야 할 자료구조 Binary Search Tree

Binary Search Tree 트리형 데이터 구조는 탐색에 최적화된 자료 구조이다. - 이진 탐색 트리 Binary Search Tree 각 노드는 키 값을 가지며 root와 left, right child 노드를 기준으로 다음을 만족해야 한다. 1. left.key root.key 3. left 서브 트리와 right 서브 트리는 BST를 만족해야 한다. - 이진 탐색 트리의 중위 순회 위 성질을 만족하기 때문에 left -> root -> right의 중위 순회에서 key 값을 순서대로 출력하면 정렬된 값을 얻을 수 있다. - 탐색 시간 높이가 h인 모든 레벨에 노드가 채워진 완전 이진트리의 전체 노드 개수는 $1 + 2 + ... + 2^h$ 이다. 전체 갯수 $2^{h+1} -1 = N$ 이므..

C++/자료 구조 2021.03.31