2012년 3월 27일 화요일

winsock api : select 입출력 다중화 함수


select

select함수는 입출력 다중화를 위해서 사용하는 함수다. 윈도는 BSD select 함수 인터페이스를 그대로 따른다.
int select( 
  __in     int nfds, 
  __inout  fd_set *readfds, 
  __inout  fd_set *writefds, 
  __inout  fd_set *exceptfds, 
  __in     const struct timeval *timeout 
); 
 
함수 선언에서 부터 매개 변수의 자료 형까지 BSD select함수와 다를바가 없다.
  1. nfds : BSD socket과의 호환을 위해 남겨 둔 것으로 실제 사용하지는 않는다. BSD select에서는 데이터 변경을 관리할 파일의 개수를 지정하기 위해 사용한다.winsock은 fd_set에 관리할 파일의 개수를 지정한다.
  2. readfds : 읽기 데이터를 확인할 파일 배열에 대한 포인터 
  3. writefds : 쓰기 데이터를 확인할 파일 배열에 대한 포인터
  4. exceptfds : 예외 사항을 확인할 파일 배열에 대한 포인터 
  5. timeout : 기다림 제한 시간

반환 값

select함수는 fd_set에 포함된 파일목록에서 데이터 변경이 있는 모든 파일의 개수를 반환한다. timeout시간동안 데이터 변경이 없었다면 0을 반환한다.

WSANOTINITIALISEDWSAStartup함수가 성공적으로 실행 된 적이 없다.
WSAEFAULT매개 변수가 잘못 사용 되었다.
WSAENETDOWN네트워크 서비시스템이 실패했다.
WSAENOTSOCK소켓이 아닌 지시자가 포함되어 있다.

설명

select함수는 하나 이상의 소켓의 상태를 알아내기 위해서 사용한다. select함수가 호출 될 때, 각 소켓의 read, write 혹은 error 상태를 검사할 것을 지정할 수 있다. 이들 소켓의 상태 정보는 fd_set 구조체에 입력하는 것으로 요청할 수 있다.

readfds는 소켓에 읽을 데이터가 있는지를 확인한다. 만약 listen 상태에 있는 소켓 즉 듣기 소켓이라면, 클라이언트의 연결이 있을 때, 반환한다. 이 후 서버는 accept함수를 호출해서 연결 소켓을 만든다.

select함수는 데이터 변경이 발생한 파일의 개수만을 반환하기 때문에, fd_set을 순환하면서 어떤 소켓에 데이터 변경이 발생했는지를 검사해야 한다. 이를 위해서는 fd_set 구조체를 제어해야 하는데 이를 위해서 아래의 매크로 함수를 제공한다. 이 매크로 함수는 리눅스와 동일하다.

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으로 초기화 한다.



댓글 없음:

댓글 쓰기