전체 글 262

[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

[TCP/IP 소켓 프로그래밍] (7-2) 다중 접속 서버 - 멀티 프로세스 서버/클라이언트

출처 : 열혈 TCP/IP 소켓 프로그래밍 윤성우 저 둘 이상의 클라이언트에게 서비스를 제공하는 멀티 프로세스 기반 다중 접속 서버 클라이언트가 보내는 메세지를 똑같은 내용으로 재전송해주는 에코 서버는 다음 과정을 거친다. 1. 에코 서버는 accept를 통해 클라이언트 연결 요청을 수락한다. 2. 이때 얻게되는 소켓의 핸들을 자식 프로세스에 복사하여 넘겨준다. 3. 자식 프로세스는 전달된 소켓 핸들을 가지고 서비스를 제공한다. 다중 접속 에코 서버 구현 - 좀비 프로세스 방지 좀비 프로세스가 될 수 있는 자식 프로세스는 프로세스 종료시 반환값을 반드시 부모 프로세스에게 전달해야한다. 그렇지 않는다면, 전달될때 까지 자식 프로세스는 소멸되지 않고 좀비 상태에 있게된다. 따라서 부모 프로세스는 자식 프로세..

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

출처 : 열혈 TCP/IP 소켓 프로그래밍 윤성우 저 둘 이상의 클라이언트에게 서비스를 제공하기 위한 다중 접속 서버 구현이 필요하다. 다중 접속 서버 구현을 위한 방법 1. 멀티프로세스 기반 서버 : 다수의 프로세스를 생성하는 방식 2. 멀티플렉싱 기반 서버: 입출력 대상을 묶어서 관리하는 방식으로 서비스 제공 3. 멀티쓰레딩 기반 서버: 클라이어트의 수만큼 스레드를 생성하는 방식으로 서비스 제공 먼저 멀티 프로세스 기반 서버를 알아본다. 본 예제는 리눅스 기반 코드이다. 프로세스란 (운영체제에 등록되어) 메모리 공간을 차지한 상태에서 실행중인 프로그램을 의미한다. - fork 함수 pid fork(void); 성공 시 프로세스 ID, 실패 시 -1 반환 fork 함수는 호출한 프로세스의 복사본을 생성..

[TCP/IP 소켓 프로그래밍] (6) IP주소와 도메인 이름 변환 / 소켓 옵션

출처 : 열혈 TCP/IP 소켓 프로그래밍 윤성우 저 IP 주소를 명명하는 도메인 이름을 통해 네트워크를 접속할 수 있다. DNS 서버 도메인 이름에 대한 IP 주소를 알려주는 서버로 호스트가 속한 네트워크에 보통 디폴트(기본) DNS 서버가 자동 설정되어 있다. 호스트는 인터넷 접속에 필요한 IP 주소를 도메인 이름을 통해 로컬 DNS 서버에 질의하고 로컬 DNS 서버는 상위 DNS 서버로 IP 주소를 요청한다. 상위 DNS 서버로 부터 IP 주소를 얻은 로컬 DNS 서버는 호스트에게 전달하여 인터넷에 접속할 수 있게된다. 도메인 이름과 관련된 정보 hostent 구조체 struct hostent { char * h_name; // official name char **h_aliases; // alia..

[디자인 패턴] 행동 패턴 (9) 메멘토 Memento

메멘토 (Memento) 패턴 1. 의도 어떤 객체의 내부 상태를 기록하는 상태 객체를 관리하고 필요할 때 지난 상태로 돌아갈 수 있도록 한다. 2. 활용 게임 플레이어의 체크포인트를 기록하거나 그래픽/텍스트 편집기에서 실행했던 명령을 되돌리는 방법, 오류에서 복구하는 방법 등 활용성이 높은 기능으로 과거의 상태나 명령들을 저장해두었다 필요할 때 거꾸로 되돌리기 위해 필요한 정보를 제공한다. 그러한 기능이 필요한 객체의 모든 정보를 노출시키지 않고 상태에 쓰이는 정보만 주기적으로 저장하며 필요할 때 요청하도록한다. 그래픽 편집기의 그리기 명령어와 되돌리기 수행 절차 1. 편집기는 사용자가 마우스로 다양한 객체를 그릴 때마다 메멘토에 요청하여 현재 상태를 저장하도록 한다. 2. 메멘토는 필요한 상태 정보를..

[TCP/IP 소켓 프로그래밍] (5) TCP 기반 파일 전송

출처 : 열혈 TCP/IP 소켓 프로그래밍 윤성우 저 파일 전송과 TCP 연결 종료 서버에서 클라이언트로 혹은 그 반대의 방향으로 파일을 전송한다고 하자. 송신자는 파일 데이터를 송신할 것이고 자신의 소켓을 종료한다. 수신자는 파일 데이터를 수신하고 소켓을 종료할 것이다. 만약 수신자가 파일 데이터를 모두 수신했을 때, "Thank You"라는 종료의 의미를 송신자에게 전송한다 하자. 그렇다면, 수신자는 파일 데이터를 모두 수신했다는 것을 언제 알 수 있을까. 1. 단순 현 시점에서 읽은 데이터를 기준으로 데이터가 없다면 종료시키는 것도 지연에 따른 수신 문제로 일찍이 종료해버릴 수도 있다. 2. 송신 종료에 대한 규약을 문자로 정한다면? 이러한 문자가 파일 내용에 포함될 수 도 있다. TCP에는 송신자..

[TCP/IP 소켓 프로그래밍] (4) UDP 기반 서버 및 클라이언트

출처 : 열혈 TCP/IP 소켓 프로그래밍 윤성우 저 UDP 소켓 UDP 소켓은 목적지에 대한 주소 정보를 부여할 필요가 없다. 즉 connect()없이 데이터를 전송할 수 있다. 대신, UDP 패킷에 목적지 주소 정보를 담는 과정이 필요하게 되었다. vs TCP 소켓 TCP 소켓의 경우 일대일 연결을 지향하기 때문에 클라이언트 쪽에서 연결하고자하는 소켓에 상대방의 주소와 포트번호를 부여하는 과정이 필요했다. 이는 흐름 제어와 같은 신뢰성 있는 전송을 위한 연결 확립이 필요했기 때문이다. 연결 확립 과정이 필요없기 때문에 서버 쪽에서 listen()을 통한 연결 대기 상태가 필요가 없다. UDP 특징 TCP와 같이 연결 확립 과정이 필요없고 데이터 전송을 바로 시작할 수 있다. 또한 UDP 패킷에 주소를..

[TCP/IP 소켓 프로그래밍] (3) TCP 기반 서버 및 클라이언트 - 2

출처 : 열혈 TCP/IP 소켓 프로그래밍 윤성우 저 TCP 소켓의 입출력 버퍼 각 소켓은 입력 버퍼와 출력 버퍼를 관리하고 recv()를 통해 입력 버퍼에서 수신된 데이터를 읽어드리고 send()를 통해 출력 버퍼로 송신할 데이터를 쓴다. 소켓을 통한 데이터 수신 처리 - 데이터 수신 int recv(SOCKET s, const char* buf, int len, int flags); - recv함수는 성공 시 수신된 데이터의 바이트 수만큼 반환하고 그렇지 않으면 SOCKET_ERROR를 반환한다. // 한번에 100 바이트를 수신함 int recvLen = recv(hServSock, message, 100, 0); 위 코드를 통해 사용자가 수신해야할 데이터가 100바이트라면, 100바이트의 데이터가..