select 함수(winsock2.h)
select 함수는 필요한 경우 동기 I/O를 수행하기 위해 대기하는 하나 이상의 소켓의 상태 결정합니다.
구문
int WSAAPI select(
[in] int nfds,
[in, out] fd_set *readfds,
[in, out] fd_set *writefds,
[in, out] fd_set *exceptfds,
[in] const timeval *timeout
);
매개 변수
[in] nfds
무시됩니다. nfds 매개 변수는 버클리 소켓과의 호환성을 위해서만 포함됩니다.
[in, out] readfds
가독성을 확인할 소켓 집합에 대한 선택적 포인터입니다.
[in, out] writefds
쓰기 가능성을 확인할 소켓 집합에 대한 선택적 포인터입니다.
[in, out] exceptfds
오류를 확인할 소켓 집합에 대한 선택적 포인터입니다.
[in] timeout
TIMEVAL 구조체 형식으로 제공되는 선택 대기 최대 시간입니다. 차단 작업의 시간 제한 매개 변수를 null 로 설정합니다.
반환 값
select 함수는 fd_set 구조에 준비되고 포함된 총 소켓 핸들 수를 반환합니다. 시간 제한이 만료되면 0이거나 오류가 발생한 경우 SOCKET_ERROR. 반환 값이 SOCKET_ERROR 경우 WSAGetLastError 를 사용하여 특정 오류 코드를 검색할 수 있습니다.
오류 코드 | 의미 |
---|---|
이 함수를 사용하기 전에 성공적인 WSAStartup 호출이 발생해야 합니다. | |
Windows 소켓 구현에서 내부 작업에 필요한 리소스를 할당할 수 없거나 readfds, writefds, exceptfds 또는 timeval 매개 변수가 사용자 주소 공간의 일부가 아닙니다. | |
네트워크 하위 시스템이 실패했습니다. | |
시간 제한 값이 잘못되었거나 세 설명자 매개 변수가 모두 null입니다. | |
WSACancelBlockingCall을 통해 차단 Windows 소켓 1.1 호출이 취소되었습니다. | |
차단 Windows 소켓 1.1 호출이 진행 중이거나 서비스 공급자가 여전히 콜백 함수를 처리하고 있습니다. | |
설명자 집합 중 하나에는 소켓이 아닌 항목이 포함되어 있습니다. |
설명
select 함수는 하나 이상의 소켓의 상태 확인하는 데 사용됩니다. 각 소켓에 대해 호출자는 읽기, 쓰기 또는 오류 상태 대한 정보를 요청할 수 있습니다. 지정된 상태 요청되는 소켓 집합은 fd_set 구조체로 표시됩니다. fd_set 구조에 포함된 소켓은 단일 서비스 공급자와 연결되어야 합니다. 이 제한을 위해 프로토콜을 설명하는 WSAPROTOCOL_INFO 구조에 동일한 providerId 값이 있는 경우 소켓은 동일한 서비스 공급자의 소켓으로 간주됩니다. 반환 시 구조체는 지정된 조건을 충족하는 이러한 소켓의 하위 집합을 반영하도록 업데이트됩니다. select 함수는 조건을 충족하는 소켓 수를 반환합니다. fd_set 구조를 조작하기 위한 매크로 집합이 제공됩니다. 이러한 매크로는 버클리 소프트웨어에서 사용되는 매크로와 호환되지만 기본 표현은 완전히 다릅니다.
매개 변수 readfds 는 가독성을 검사할 소켓을 식별합니다. 소켓이 현재 수신 대기 상태인 경우 들어오는 연결 요청을 받은 경우 가독성으로 표시되어 허용 이 차단 없이 완료되도록 보장됩니다. 다른 소켓의 경우 가독성은 recv, WSARecv, WSARecvFrom 또는 recvfrom 호출이 차단되지 않도록 큐에 대기 중인 데이터를 읽을 수 있음을 의미합니다.
연결 지향 소켓의 경우 가독성은 소켓 닫기 요청이 피어로부터 수신되었음을 나타낼 수도 있습니다. 가상 회로가 정상적으로 닫혀 있고 모든 데이터가 수신된 경우 recv 는 0바이트를 읽은 상태로 즉시 반환됩니다. 가상 회로가 다시 설정되면 WSAECONNRESET과 같은 오류 코드로 즉시 recv가 완료됩니다. 소켓 옵션 SO_OOBINLINE 사용하도록 설정되었는지 OOB 데이터의 존재가 확인됩니다( setsockopt 참조).
writefds 매개 변수는 쓰기 가능성을 검사할 소켓을 식별합니다. 소켓이 연결 호출(차단 해제)을 처리하는 경우 연결 설정이 성공적으로 완료되면 소켓을 쓸 수 있습니다. 소켓이 연결 호출을 처리하지 않는 경우 쓰기성은 send, sendto 또는 WSASendto 가 성공하도록 보장됨을 의미합니다. 그러나 len 매개 변수가 사용 가능한 나가는 시스템 버퍼 공간의 양을 초과하는 경우 차단 소켓에서 차단할 수 있습니다. 특히 다중 스레드 환경에서 이러한 보장이 유효한 것으로 간주될 수 있는 기간은 지정되지 않았습니다.
매개 변수 exceptfds 는 OOB 데이터의 존재 여부 또는 예외적 오류 조건을 확인할 소켓을 식별합니다.
요약하자면, select 가 다음과 같은 경우 를 반환하면 특정 집합에서 소켓이 식별됩니다.
readfds:
- listen이 호출되고 연결이 보류 중인 경우 수락이 성공합니다.
- 데이터를 읽을 수 있습니다(SO_OOBINLINE 사용하도록 설정된 경우 OOB 데이터 포함).
- 연결이 닫혀 있거나 다시 설정/종료되었습니다.
- 연결 호출(차단 해제)을 처리하는 경우 연결이 성공합니다.
- 데이터를 보낼 수 있습니다.
- 연결 호출(차단 해제)을 처리하는 경우 연결 시도가 실패했습니다.
- OOB 데이터는 읽기에 사용할 수 있습니다(SO_OOBINLINE 사용하지 않도록 설정된 경우에만).
- FD_ZERO(*set) - 빈 집합으로 집합을 초기화합니다. 를 사용하기 전에 항상 집합을 지워야 합니다.
- FD_CLR *set) - 집합에서 소켓 s를 제거합니다.
- FD_ISSET *set) - 가 집합의 멤버인지 확인하고 해당하는 경우 TRUE를 반환합니다.
- FD_SET *set) - 설정할 소켓을 추가합니다.
매개 변수 제한 시간은선택 작업을 완료하는 데 걸리는 시간을 제어합니다. 시간 초과가 null 포인터인 경우 하나 이상의 설명자가 지정된 조건을 충족할 때까지 select가 무기한 차단됩니다. 그렇지 않으면 시간 제한은 반환하기 전에 선택해야 하는 최대 시간을 지정하는 TIMEVAL 구조를 가리킵니다. select가 반환되면 TIMEVAL 구조체의 내용이 변경되지 않습니다. TIMEVAL이 {0, 0}으로 초기화되면 select가 즉시 반환됩니다. 선택한 소켓의 상태를 폴링하는 데 사용됩니다. select가 즉시 반환되는 경우 선택 호출은 차단 해제로 간주되고 비 차단 호출에 대한 표준 가정이 적용됩니다. 예를 들어 차단 후크가 호출되지 않고 Windows 소켓이 생성되지 않습니다.
Windows 8.1 및 Windows Server 2012 R2: 이 함수는 Windows 8.1, Windows Server 2012 R2 이상에서 Windows 스토어 앱에서 지원됩니다.
요구 사항
지원되는 최소 클라이언트 | Windows 8.1, Windows Vista [데스크톱 앱 | UWP 앱] |
지원되는 최소 서버 | Windows Server 2003 [데스크톱 앱 | UWP 앱] |
대상 플랫폼 | Windows |
헤더 | winsock2.h |
라이브러리 | Ws2_32.lib |
DLL | Ws2_32.dll |