앞의 포스팅에서 설명한 멀티플렉싱 기법을 구현하는데 가장 많이 사용되는 방법이 바로 Select함수를 이용하는 것이다. 또한 리눅스 뿐만 아니라 윈도우에도 같은 이름으로 동일한 기능을 제공하는 함수가 있기 때문에 이식성에도 좋다.

 

#include<sys/select.h>

#include<sys/time.h>

 

int select(int maxfd, fd_set *readset, fd_set *writeset, fd_set *exceptest, const struct timeval *timeout);

->성공시 0이상 실패시 -1 반환.

 

maxfd -> 검사 대상이 되는 파일 디스크립터의 수.

 

readset -> fd_set형 변수에 수신된 데이터의 존재여부에 관심 있는 파일 디스크립터 정보를 모두

  등록해서 변수의 주소값 전달.

 

writeset -> fd_set형 변수에 블로킹 없는 데이터 전송의 가능여부에 관심 있는 파일 디스크립터 정보를

  모두 등록해서 그 변수의 주소 값을 전달한다.

 

exceptset -> fd_set형 변수에 예외상황의 발생여부에 관심이 있는 파일 디스크립터 정보를 모두

     등록해서 그 변수의 주소 값 전달.

 

 

Select 함수의 기능

 

Select 함수를 이용하면 한곳에 여러개의 파일 디스크립터를 모아놓고 동시에 관찰할 수 있다.

 

1. 수신한 데이터를 지니고 있는 소켓이 존재하는지.

2. 불로킹되지 않고 데이터의 전송이 가능한 소켓은 무엇인지.

3.예외상황이 발생한 소켓은 무엇인지.

 

를 관찰할수가 있다.

 

Select 함수 호출순서 

 

 

Select 함수를 호출하기 전에는 파일디스크립터,검사 범위, 타임아웃의 설정을 해줘야 비로소 Select함수를 호출할 수가 있다.

 

파일디스크립터 설정

 

Select 함수를 이용하여 여러개의 파일디스크립터를 관리할 수 있는데, 여러개의 파일디스크립터를 모을 떄도 목적에 따라서 구분해서 모아야 하고, 파일 디스크립터를 모을 때 사용하는 것이 fd_set형 변수이다. fd_set형은 0과 1로 표현되는, 비트단위로 이뤄진 배열이다.

 

                       <fd_set 자료형>

 

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로 전달된 파일 디스크립터 정보가 있으면 양수반환.

'Programming > Socket' 카테고리의 다른 글

I/O 멀티플렉싱  (0) 2012.05.15
로그파일을 남기는 서버  (0) 2012.05.14
클라이언트 IP 가져오기  (0) 2012.05.14
멀티프로세스 소스  (0) 2012.05.10
멀티프로세스 서버  (0) 2012.05.08

+ Recent posts