본문 바로가기

전체 글68

(IOModel)멀티플렉싱 - select 멀티플렉싱이란? 여러명이서 통신할때 하나의 채널만 가지고 통신하는 방식을 말한다. 멀티쓰레드, 멀티 프로세스가 여러 채널을 만들어 통신한다면 멀티플렉싱은 하나의 프로세스, 스레드를 가지고 여러 명의 통신을 연결시킨다. 여러명이 접속할 수 있는 서버를 만들기 위해 여러 IO모델들이 사용된다. 오늘은 대표적인 멀티플렉싱 방식의 IO 모델인 select에 대해 살펴보고자 한다. 1. select 동작 과정 서버는 여러 클라이언트의 접속을 받는다. 그 후 각 클라이언트의 이벤트(데이터 수신여부, 데이터 송신가능 여부, 오류 수신 여부 등)의 이벤트가 들어옴에 따라 해당 클라이언트에게 적절한 응답을 해줘야 한다. select의 경우 먼저 FD_SET이라는 구조체를 통해 클라이언트들을 등록시킨다. 해당 구조체는 L.. 2020. 10. 5.
(소켓,프로토콜)TCP 소켓의 종료 1. 깔끔한 종료 TCP에서 연결된 소켓을 종료할때는 4-way handshake라는 과정을 거친다. 총 4단계로 tcp의 특성에 맞게 안전하게 종료 가능한 방법이다. - 과정 먼저 종료를 원하는 쪽에서 closesocket과 같은 소켓 종료함수를 호출한다. 그럼 해당 소켓에 대한 권한이 tcp커널로 넘어가게 되고 만약 소켓이 블로킹 소켓이면 위의 종료과정이 완전히 끝날때까지 블로킹되고, 논블로킹 소켓이면 EWOULDBLOCK을 리턴한다. 그리고 해당 호스트는 FIN_WAIT상태에 들어가고 상대호스트의 FIN을 기다린다(FIN_WAIT). FIN 메시지를 받은 상대 호스트는 받은 메시지에 대한 ACK 신호를 보내고 역시나 closesocket과 같은 소켓종료함수를 보내기 전까지 ClOSE_WAIT상태가 .. 2020. 10. 5.
(소켓,프로토콜) UDP소켓 데이터의 경계 UDP는 TCP와 다르게 데이터의 경계가 있다. 그래서 하나의 패킷이 하나의 데이터가 되는데, 이때문에 UDP소켓이 전송하는 패킷을 데이터그램이라고 부른다. TCP는 데이터의 경계가 없다. send, recv 함수를 통해 해당 소켓의 입출력 버퍼를 읽고 쓰고 하지만 실제 OS가 보낼때 해당 데이터가 나뉘어서 갈수도 있다. 그래서 받는 입장에선 내가 받을 데이터의 용량 만큼 계속 recv해줘야 한다. 하지만 UDP는 입출력 버퍼에 먼저 저장되는게 아닌 곧 바로 OS단에서 데이터를 전송한다. 물론 그렇다고 함수가 리턴했을때 바로 데이터를 보냈다고 확신되는건 아니다. 다만 보낸 횟수에 따라 데이터가 나뉘어서 상대 호스트에 전달되기 때문에 3번 send하였으면 상대방도 3번 recv해줘야 한다. .. 2020. 9. 22.
(C++)연관컨테이너(set, multiset, map, multimap) 연관 컨테이너와 시퀀스 컨테이너(vector, deque, list)의 차이 각 원소를 삽입할때 연관 컨테이너는 자동으로 함수객체(디펄트로 less객체)에 따라 정렬되며, 또한 시퀀스컨테이너는 배열, 리스트로 구현되는것과 다르게 내부 데이터가 Balaced Tree로 구현된다. push_back(), push_front(), front(), back()같은 함수가 존재하지 않는다. 그렇기에 접근에 유리한 vector와 deque / 삽입, 삭제에 유리한 List 에 비해 연관 컨테이너는 탐색에 Log 시간대를 가지며 유리하다. 또한 연관컨테이너는 4개 모두 같은 인터페이스를 가진다. multi? multi가 붙은 컨테이너는 키값의 중복을 허용한다. equalrange(), lower_bound(), up.. 2020. 9. 22.