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 를 사용하여 특정 오류 코드를 검색할 수 있습니다.

오류 코드 의미
WSANOTINITIALISED
이 함수를 사용하기 전에 성공적인 WSAStartup 호출이 발생해야 합니다.
WSAEFAULT
Windows 소켓 구현에서 내부 작업에 필요한 리소스를 할당할 수 없거나 readfds, writefds, exceptfds 또는 timeval 매개 변수가 사용자 주소 공간의 일부가 아닙니다.
WSAENETDOWN
네트워크 하위 시스템이 실패했습니다.
WSAEINVAL
시간 제한 값이 잘못되었거나 세 설명자 매개 변수가 모두 null입니다.
WSAEINTR
WSACancelBlockingCall을 통해 차단 Windows 소켓 1.1 호출이 취소되었습니다.
WSAEINPROGRESS
차단 Windows 소켓 1.1 호출이 진행 중이거나 서비스 공급자가 여전히 콜백 함수를 처리하고 있습니다.
WSAENOTSOCK
설명자 집합 중 하나에는 소켓이 아닌 항목이 포함되어 있습니다.

설명

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 데이터의 존재 여부 또는 예외적 오류 조건을 확인할 소켓을 식별합니다.

참고 대역 외 데이터는 SO_OOBINLINE 옵션이 FALSE인 경우에만 이러한 방식으로 보고됩니다. 소켓이 연결 호출을 처리하는 경우(차단 해제) 연결 시도의 실패는 exceptfds 에 표시됩니다(애플리케이션은 실패가 발생한 이유를 설명하기 위해 getsockopt SO_ERROR 호출해야 합니다). 이 문서에서는 포함할 다른 오류를 정의하지 않습니다.
 
readfds, writefds 또는 exceptfds 매개 변수 두 개를null로 지정할 수 있습니다. 하나 이상이 null이 아니어야 하며 null 이 아닌 설명자 집합에는 소켓에 대한 하나 이상의 핸들이 포함되어야 합니다.

요약하자면, select 가 다음과 같은 경우 를 반환하면 특정 집합에서 소켓이 식별됩니다.

readfds:

  • listen이 호출되고 연결이 보류 중인 경우 수락이 성공합니다.
  • 데이터를 읽을 수 있습니다(SO_OOBINLINE 사용하도록 설정된 경우 OOB 데이터 포함).
  • 연결이 닫혀 있거나 다시 설정/종료되었습니다.
writefds:
  • 연결 호출(차단 해제)을 처리하는 경우 연결이 성공합니다.
  • 데이터를 보낼 수 있습니다.
exceptfds:
  • 연결 호출(차단 해제)을 처리하는 경우 연결 시도가 실패했습니다.
  • OOB 데이터는 읽기에 사용할 수 있습니다(SO_OOBINLINE 사용하지 않도록 설정된 경우에만).
설명자 집합을 조작하고 확인하기 위해 머리글 파일 Winsock2.h에 4개의 매크로가 정의되어 있습니다. 변수 FD_SETSIZE 집합의 최대 설명자 수를 결정합니다. (FD_SETSIZE 기본값은 64이며 Winsock2.h를 포함하기 전에 다른 값으로 FD_SETSIZE 정의하여 수정할 수 있습니다. 내부적으로 fd_set 구조의 소켓 핸들은 Berkeley Unix에서와 같이 비트 플래그로 표시되지 않습니다. 해당 데이터 표현은 불투명합니다. 이러한 매크로를 사용하면 서로 다른 소켓 환경 간에 소프트웨어 이식성이 유지됩니다. fd_set 콘텐츠를 조작하고 검사 매크로는 다음과 같습니다.
  • 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 소켓이 생성되지 않습니다.

참고select 함수는 WSAAsyncSelect 또는 WSAEventSelect에 등록된 소켓 이벤트의 지속성에 영향을 주지 않습니다.
 
참고시간 제한 매개 변수가 NULL로 설정된 select와 같은 차단 Winsock 호출을 실행하는 경우 Winsock은 호출이 완료되기 전에 네트워크 이벤트를 기다려야 할 수 있습니다. Winsock은 이 상황에서 경고 가능한 대기를 수행하며, 동일한 스레드에서 예약된 APC(비동기 프로시저 호출)에 의해 중단될 수 있습니다. 동일한 스레드에서 지속적인 차단 Winsock 호출을 중단한 APC 내에서 또 다른 차단 Winsock 호출을 실행하면 정의되지 않은 동작이 발생하며 Winsock 클라이언트에서 시도해서는 안 됩니다.
 
Windows Phone 8: 이 함수는 Windows Phone 8 이상에서 Windows Phone 스토어 앱에서 지원됩니다.

Windows 8.1Windows 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

추가 정보

TIMEVAL

WSAAsyncSelect

WSAEventSelect

Winsock 함수

Winsock 참조

받아들일

connect

Recv

recvfrom

send