Select 함수 -------------------------------------------------------------------------------------------------------

하나의 소켓 하나의 쓰레드로 여러개의 소켓을 관리하는 방식인 멀티플렉싱은 다음의 Select함수를 사용하여 구현할 수 있다.(다른 함수나 로직은 아직 배우지 않았다.)

함수의 구조는 다음과 같다.


int select(

  _In_     int nfds, -> 동시에 관리할 소켓의 개수

  _Inout_  fd_set *readfds, -> fd_set형 수신된 데이터의 존재여부에 관심 있는 소켓 정보를 모두 등록해서 그 변수의 주소값을 전달한다.

  _Inout_  fd_set *writefds, -> fd_set형 블로킹 없는 데이터 전송의 기능여부에 관심있는 소켓정보를 모두 등록해서 그 변수의 주소 값을 전달한다.

  _Inout_  fd_set *exceptfds, -> fd_set형 '예외상황의 발생여부'에 관심이 있는 파일 디스크립트 정보를 모두 등록해서 그 변수의 값을 전달한다.

  _In_     const struct timeval *timeout -> select 함수 호출 이후 무한정 블로킹 상태에 빠지지 않도록 타임아웃을 설정하기 위한 인자를 전달한다.

); -> 오류발생시에는 -1이 반환되고 타임아웃에 의한 반환 시에는 0이 반환된다. 그리고 관심 대상으로 등록된 소켓에 해당 관심에 관련된 변화가 발생하면 0보다 큰 값이 반환된다. 이 값은 변화가 발생한 소켓의 수를 의미한다.


fd_set 구조체 -----------------------------------------------------------------------------------------------------


fd_set 구조체에 대해서 알아봅시다.


typedef struct fd_set {
  u_int  fd_count; -> 현재 구조체 안에 등록되어있는 파일 개수
  SOCKET fd_array[FD_SETSIZE]; -> 소켓을 등록할 수 있는 소켓 배열
} fd_set;

이 구조체를 위한 전용매크로 함수가 존재한다.
FD_ZERO(fd_set* fdset) 인자로 전달된 fd_set구조체의 모든 비트를 0으로 만든다.
FD_SET(int fd, fd_set* fdset) 매개변수 fdset로 전달된 주소의 변수에 매개변수 fd로 전달된 소켓 정보를 등록한다.
FD_CLR(int fd, fd_set* fdset) 매개변수 fdset로 전달된 주소의 변수에 매개변수 fd로 전달된 소켓 정보를 삭제한다.
FD_ISSET(int fd, fd_set* fdset) 매개변수 fdset로 전달된 주소의 변수에 매개변수 fd로 전달된 소켓에 말그대로 정보(Select의 세가지 체크값에 대한 변화값이 있으면 체크한다) 양수를 반환한다.




Posted by JJOREG