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함수와 다를바가 없다.
- nfds : BSD socket과의 호환을 위해 남겨 둔 것으로 실제 사용하지는 않는다. BSD select에서는 데이터 변경을 관리할 파일의 개수를 지정하기 위해 사용한다.winsock은 fd_set에 관리할 파일의 개수를 지정한다.
- readfds : 읽기 데이터를 확인할 파일 배열에 대한 포인터
- writefds : 쓰기 데이터를 확인할 파일 배열에 대한 포인터
- exceptfds : 예외 사항을 확인할 파일 배열에 대한 포인터
- timeout : 기다림 제한 시간
반환 값
select함수는 fd_set에 포함된 파일목록에서 데이터 변경이 있는 모든 파일의 개수를 반환한다. timeout시간동안 데이터 변경이 없었다면 0을 반환한다.
WSANOTINITIALISED | WSAStartup함수가 성공적으로 실행 된 적이 없다. |
WSAEFAULT | 매개 변수가 잘못 사용 되었다. |
WSAENETDOWN | 네트워크 서비시스템이 실패했다. |
WSAENOTSOCK | 소켓이 아닌 지시자가 포함되어 있다. |
설명
select함수는 하나 이상의 소켓의 상태를 알아내기 위해서 사용한다. select함수가 호출 될 때, 각 소켓의 read, write 혹은 error 상태를 검사할 것을 지정할 수 있다. 이들 소켓의 상태 정보는 fd_set 구조체에 입력하는 것으로 요청할 수 있다.
readfds는 소켓에 읽을 데이터가 있는지를 확인한다. 만약 listen 상태에 있는 소켓 즉 듣기 소켓이라면, 클라이언트의 연결이 있을 때, 반환한다. 이 후 서버는 accept함수를 호출해서 연결 소켓을 만든다.
select함수는 데이터 변경이 발생한 파일의 개수만을 반환하기 때문에, fd_set을 순환하면서 어떤 소켓에 데이터 변경이 발생했는지를 검사해야 한다. 이를 위해서는 fd_set 구조체를 제어해야 하는데 이를 위해서 아래의 매크로 함수를 제공한다. 이 매크로 함수는 리눅스와 동일하다.
댓글 없음:
댓글 쓰기