앞의 포스팅에서 설명한 멀티플렉싱 기법을 구현하는데 가장 많이 사용되는 방법이 바로 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 |