select함수는 입출력:::다중화(:12)를 위해서 사용하는 함수다. 윈도는 BSD select(:12) 함수 인터페이스를 그대로 따른다.
int select(
__in int nfds,
__inout fd_set *readfds,
__inout fd_set *writefds,
__inout fd_set *exceptfds,
__in const struct timeval *timeout
);
함수 선언에서 부터 매개 변수의 자료 형까지 BSD select함수와 다를바가 없다.
nfds : BSD:::socket(:12)과의 호환을 위해 남겨 둔 것으로 실제 사용하지는 않는다. BSD select에서는 데이터 변경을 관리할 파일의 개수를 지정하기 위해 사용한다. winsock(:12)은 fd_set에 관리할 파일의 개수를 지정한다.
readfds : 읽기 데이터를 확인할 파일 배열에 대한 포인터
writefds : 쓰기 데이터를 확인할 파일 배열에 대한 포인터
exceptfds : 예외 사항을 확인할 파일 배열에 대한 포인터
timeout : 기다림 제한 시간
반환 값
select함수는 fd_set에 포함된 파일목록에서 데이터 변경이 있는 모든 파일의 개수를 반환한다. timeout시간동안 데이터 변경이 없었다면 0을 반환한다.
WSANOTINITIALISED
WSAStartup(:4100)함수가 성공적으로 실행 된 적이 없다.
WSAEFAULT
매개 변수가 잘못 사용 되었다.
WSAENETDOWN
네트워크 서비시스템이 실패했다.
WSAENOTSOCK
소켓이 아닌 지시자가 포함되어 있다.
설명
select함수는 하나 이상의 소켓의 상태를 알아내기 위해서 사용한다. select함수가 호출 될 때, 각 소켓의 read, write 혹은 error 상태를 검사할 것을 지정할 수 있다. 이들 소켓의 상태 정보는 fd_set 구조체에 입력하는 것으로 요청할 수 있다.
readfds는 소켓에 읽을 데이터가 있는지를 확인한다. 만약 listen(:4100) 상태에 있는 소켓 즉 듣기 소켓이라면, 클라이언트의 연결이 있을 때, 반환한다. 이 후 서버는 accept(:4100)함수를 호출해서 연결 소켓을 만든다.
select함수는 데이터 변경이 발생한 파일의 개수만을 반환하기 때문에, fd_set을 순환하면서 어떤 소켓에 데이터 변경이 발생했는지를 검사해야 한다. 이를 위해서는 fd_set 구조체를 제어해야 하는데 이를 위해서 아래의 매크로 함수를 제공한다. 이 매크로 함수는 리눅스(:12)와 동일하다.
FD_CLR(s, *set);
fd_set에서 소켓 s를 삭제 한다.
FD_ISSET(s, *set);
fd_set에 소켓 s에 변경된 데이터가 있는지 검사한다.
FD_SET(s, *set);
fd_set에 소켓 s를 추가한다.
FD_ZERO(s, *set);
fd_set을 0으로 초기화 한다.
select
반환 값
설명
Recent Posts
Archive Posts
Tags