1. 멀티플렉싱이란?
한 개의 프로세스가 다중 클라이언트와 통신하는 또 다른 방식으론 멀티플렉싱이 있다.
멀티플렉싱이란 하나의 채널을 통해 다중 데이터가 묶여 전송되는 기술이다.
이렇게 다중 데이터가 하나의 채널, select함수를 통해 프로세스로 데이터를 전달받는것이다.
이 select 함수는 어떤 기능을 하고 어떤 호출을 할까?
기본적으로 select함수는 events가 발생한 소켓을 선택해주는 것이다.
여기서 이벤트는 소켓이 데이터를 수신했거나, 소켓이 예외가 발생했거나, 소켓이 데이터 전송이 가능한지 (read, write, exception)가 있다.
대략적인 실행 흐름으로는 소켓설정 -> 함수 호출 -> 결과(이벤트 발생 소켓)확인 순으로 진행된다.
2. select함수
이제 이 select 함수와 select를 위한 파일 디스크립터를 설정하는 부분에 대해서 확인해보자.
select함수의 원형은 다음과 같다.
함수 인자에 대해서 설명해보자면, nfds는 파일 디스크립터 범위 (0 ~ nfds-1)를 의미하고 readfds, writefds, exceptfst는 읽기, 쓰기, 예외 이벤트에 대해 관측하고자 하는 파일 디스크립터의 집합이고 timeout은 결과 발생까지 프로그램을 블로킹 상태로 만들 시간 구조체이다.
눈여겨 볼 것은 관측하고자 하는 파일 디스크립터의 집합에 대한 부분인데, 이 집합이 어떻게 생겼고, 어떻게 설정할지를 이제부터 알아보자.
쉽게보자면 이 구조체는 0부터 nfds-1까지 관측 여부를 저장하는 flag로 저장된 데이터의 연속인데, 이 set을 우리는 다음과 같은 메크로를 통해 설정해줄 수 있다.
이렇게 구성되어 있는 set을 select에게 전달하면 select 함수는 성공 시 변화가 발생한 파일디스크립터의 값을 리턴하고, 인자로 전달된 set에서 이벤트가 발생한 파일 디스크립터를 제외하고 모두 0으로 바꿔준다.
timeout으로 전달될 시간 구조체 timeval의 형태는 다음과 같다
만약 이 구조체를 NULL로 전달하면 시간을 무한대로 설정할 수 있다.
이렇게 정의된 시간동안 모니터링을 하고 있는 파일 디스크립터에 이밴트가 발생하지 않으면 select함수는 0을 반환하게 된다.
'학교 공부 > 네트워크' 카테고리의 다른 글
세마포어, 뮤텍스를 활용한 공유 자원 제어 (0) | 2021.04.14 |
---|---|
멀티 쓰레드를 활용한 멀티 클라이언트 TCP 통신 (0) | 2021.04.14 |
멀티 프로세스를 활용한 다중 클라이언트 TCP 통신, 좀비 프로세스 삭제 (0) | 2021.04.11 |
네트워크 프로그래밍 (VM의 NAT와 Bridge, UDT) (0) | 2021.04.01 |