다음을 통해 공유


LPWSPEVENTSELECT 콜백 함수(ws2spi.h)

LPWSPEventSelect 함수는 제공된 네트워크 이벤트 집합과 연결할 이벤트 개체를 지정합니다.

통사론

LPWSPEVENTSELECT Lpwspeventselect;

int Lpwspeventselect(
  [in]  SOCKET s,
  [in]  WSAEVENT hEventObject,
  [in]  long lNetworkEvents,
  [out] LPINT lpErrno
)
{...}

매개 변수

[in] s

소켓을 식별하는 설명자입니다.

[in] hEventObject

제공된 네트워크 이벤트 집합과 연결할 이벤트 개체를 식별하는 핸들입니다.

[in] lNetworkEvents

Windows 소켓 SPI 클라이언트에 관심이 있는 네트워크 이벤트의 조합을 지정하는 비트 마스크입니다. 이러한 값과 함께 비트 OR 연산자를 사용하여 생성됩니다.

의미
FD_READ
읽기 준비 상태 알림을 발급합니다.
FD_WRITE
쓰기 준비 상태 알림을 발급합니다.
FD_OOB
OOB 데이터 도착 알림을 발급합니다.
FD_ACCEPT
들어오는 연결에 대한 알림을 발급합니다.
FD_CONNECT
완료된 연결에 대한 알림을 발급합니다.
FD_CLOSE
소켓 닫기 알림을 발급합니다.
FD_QOS
소켓(QoS) 변경에 대한 알림을 발급합니다.
FD_GROUP_QOS
예약.
FD_ROUTING_INTERFACE_CHANGE
지정된 대상에 대한 라우팅 인터페이스 변경에 대한 알림을 발급합니다.
FD_ADDRESS_LIST_CHANGE
소켓의 주소 패밀리에 대한 로컬 주소 목록 변경에 대한 알림을 발생합니다.

[out] lpErrno

오류 코드에 대한 포인터입니다. 자세한 내용은 반환 값 섹션을 참조하세요.

반환 값

Windows Sockets SPI 클라이언트의 네트워크 이벤트 사양 및 관련 이벤트 개체가 성공한 경우 반환 값은 0입니다. 그렇지 않으면 SOCKET_ERROR 값이 반환되고 lpErrno특정 오류 번호를 사용할 수 있습니다.

오류 코드 의미
WSAENETDOWN
네트워크 하위 시스템이 실패했습니다.
WSAEINVAL
지정된 매개 변수 중 하나가 잘못되었거나 지정된 소켓이 잘못된 상태임을 나타냅니다.
WSAEINPROGRESS
Windows 소켓 호출 차단이 진행 중이거나 서비스 공급자가 여전히 콜백 함수를 처리하고 있습니다.
WSAENOTSOCK
설명자가 소켓이 아닙니다.

발언

이 함수는 hEventObject이벤트 개체를 지정하여 선택한 네트워크 이벤트, lNetworkEvents연결하도록 지정하는 데 사용됩니다. 이벤트 개체가 지정된 소켓은 식별됩니다. 이벤트 개체는 지정된 네트워크 이벤트가 발생할 때 설정됩니다.

LPWSPEventSelectLPWSPAsyncSelect매우 유사하게 작동합니다. 이 경우 지명된 네트워크 이벤트가 발생할 때 수행되는 작업의 차이입니다. WSPAsyncSelect Windows Sockets SPI 클라이언트 지정 Windows 메시지를 게시하는 반면, LPWSPEventSelect는 연결된 이벤트 개체를 설정하고 내부 네트워크 이벤트 레코드에 이 이벤트의 발생을 기록할 있습니다. Windows 소켓 SPI 클라이언트는 LPWSPEnumNetworkEvents 사용하여 내부 네트워크 이벤트 레코드의 내용을 검색하여 지정된 네트워크 이벤트 중 어떤 이벤트가 발생했는지 확인할 수 있습니다.

LPWSPEventSelectLPWSPEnumNetworkEvents통해 네트워크 활동 및 오류를 기록하고 검색할 수 있는 유일한 함수입니다. 해당 함수가 네트워크 활동 및 오류를 보고하는 방법을 알아보려면 LPWSPSelectLPWSPAsyncSelect 대한 설명을 참조하세요.

이 함수는 lNetworkEvents값에 관계없이 소켓 비블로킹 모드로 자동으로 설정합니다.

소켓에 대한 LPWSPEventSelect 실행하면 이전 LPWSPAsyncSelect 취소되거나 동일한 소켓에 대한 LPWSPEventSelect 내부 네트워크 이벤트 레코드가 지워지게 됩니다. 예를 들어 이벤트 개체를 읽기 및 쓰기 네트워크 이벤트와 연결하려면 Windows Sockets SPI 클라이언트가 다음과 같이 FD_READ 및 FD_WRITE 모두 LPWSPEventSelect 호출해야 합니다.

rc = WSPEventSelect(s, hEventObject, FD_READ | FD_WRITE);

다른 네트워크 이벤트에 대해 다른 이벤트 개체를 지정할 수 없습니다. 다음 코드는 작동하지 않습니다. 두 번째 호출은 첫 번째 호출의 효과를 취소하고 유일한 연결은 hEventObject2와 연결된 FD_WRITE 네트워크 이벤트입니다.

// Incorrect example.
rc = WSPEventSelect(s, hEventObject1, FD_READ);
rc = WSPEventSelect(s, hEventObject2, FD_WRITE);

소켓에서 네트워크 이벤트 연결 및 선택을 취소하려면 lNetworkEvents 0으로 설정해야 합니다. 이 경우 hEventObject 매개 변수는 무시됩니다.

rc = WSPEventSelect(s, hEventObject, 0);

LPWSPCloseSocket 소켓을 닫으면 소켓에 대한 LPWSPEventSelect 지정된 네트워크 이벤트의 연결 및 선택도 취소됩니다. 그러나 Windows 소켓 SPI 클라이언트는 여전히 WSACloseEvent 호출하여 이벤트 개체를 명시적으로 닫고 리소스를 해제해야 합니다.

LPWSPAccept'ed 소켓은 수락하는 데 사용되는 수신 대기 소켓과 동일한 속성을 가지므로 수신 소켓에 대해 설정된 LPWSPEventSelect 연결 및 네트워크 이벤트 선택 집합이 허용된 소켓에 적용됩니다. 예를 들어 수신 소켓이 FD_ACCEPT, FD_READ 및 FD_WRITE hEventObject LPWSPEventSelect 연결을 경우 해당 수신 소켓에 허용되는 모든 소켓에도 동일한 hEventObject연결된 FD_ACCEPT, FD_READ 및 FD_WRITE 네트워크 이벤트가 있습니다. 다른 hEventObject 또는 네트워크 이벤트가 필요한 경우 Windows 소켓 SPI 클라이언트는 LPWSPEventSelect호출하여 허용되는 소켓과 원하는 새 정보를 전달해야 합니다.

네트워크 이벤트의 발생을 성공적으로 기록하고 연결된 이벤트 개체에 신호를 전송한 후에는 Windows Sockets SPI 클라이언트가 해당 네트워크 이벤트의 설정 및 관련 이벤트 개체의 신호를 암시적으로 다시 사용하도록 설정하는 함수 호출을 수행할 때까지 해당 네트워크 이벤트에 대한 추가 작업이 수행되지 않습니다.

네트워크 이벤트 함수 다시 사용
FD_READ LPWSPRecv 또는 LPWSPRecvFrom
FD_WRITE LPWSPSend 또는 LPWSPSendTo
FD_OOB LPWSPRecv 또는 LPWSPRecvFrom
FD_ACCEPT LPWSPAccept반환된 오류 코드가 WSATRY_AGAIN 조건 함수가 반환되었음을 나타내는 경우가 아니면 CF_DEFER
FD_CONNECT 없음
FD_CLOSE 없음
FD_QOS SIO_GET_QOS 사용하여 LPWSPIoctl
FD_GROUP_QOS 소켓 그룹에서 나중에 사용하도록 예약됨: SIO_GET_GROUP_QOS LPWSPIoctl
FD_ROUTING_INTERFACE_CHANGE 명령 SIO_ROUTING_INTERFACE_CHANGE 사용하여 LPWSPIoctl
FD_ADDRESS_LIST_CHANGE 명령 SIO_ADDRESS_LIST_CHANGE 사용하여 LPWSPIoctl

다시 활성화 루틴에 대한 호출은 실패하더라도 관련 네트워크 이벤트 및 이벤트 개체에 대한 기록 및 신호를 다시 사용하도록 설정합니다.

FD_READ, FD_OOB 및 FD_ACCEPT 네트워크 이벤트의 경우 네트워크 이벤트 기록 및 이벤트 개체 신호는 수준 트리거. 즉, 다시 활성화 루틴이 호출되고 호출 후에도 관련 네트워크 조건이 여전히 유효한 경우 네트워크 이벤트가 기록되고 연결된 이벤트 개체에 신호가 전송됩니다. 이렇게 하면 Windows 소켓 SPI 클라이언트가 이벤트 기반이 될 수 있지만 한 번에 도착하는 데이터의 양에 대해 걱정하지 않을 수 있습니다. 다음 시퀀스를 고려합니다.

  1. 서비스 공급자는 소켓 100바이트의 데이터를 수신하고, FD_READ 네트워크 이벤트를 기록하고, 연결된 이벤트 개체에 신호를 전송합니다.
  2. Windows 소켓 SPI 클라이언트는 WSPRecv(s, buffptr, 50, 0) 50바이트를 읽습니다.
  3. 서비스 공급자는 FD_READ 네트워크 이벤트를 기록하고, 읽을 데이터가 계속 있으므로 연결된 이벤트 개체에 다시 신호를 전송합니다.

이러한 의미 체계를 사용하면 Windows Sockets SPI 클라이언트가 FD_READ 네트워크 이벤트에 대한 응답으로 사용 가능한 모든 데이터를 읽을 필요가 없습니다. 대신 각 FD_READ 네트워크 이벤트에 대한 응답으로 단일 LPWSPRecv 적합합니다.

FD_QOS 및 FD_GROUP_QOS 이벤트는 에지 트리거간주됩니다. QOS(서비스 품질) 변경이 발생할 때 메시지가 정확히 한 번 게시됩니다. 서비스 공급자가 QOS의 추가 변경을 감지하거나 Windows 소켓 SPI 클라이언트가 소켓에 대한 QOS를 재협상할 때까지 추가 표시가 실행되지 않습니다.

FD_ROUTING_INTERFACE_CHANGE 및 FD_ADDRESS_LIST_CHANGE 이벤트는 에지 트리거 간주됩니다. Windows 소켓 SPI 클라이언트가 SIO_ROUTING_INTERFACE_CHANGE 또는 SIO_ADDRESS_LIST_CHANGE 사용하여 WSAIoctl 발급하여 알림을 요청한 변경이 발생하면 메시지가 정확히 한 번 게시됩니다. Windows Sockets SPI 클라이언트가 IOCTL 재발행하고 IOCTL이 발급된 이후 다른 변경 내용이 검색될 때까지 추가 메시지가 표시되지 않습니다.

Windows Sockets SPI 클라이언트가 LPWSPEventSelect호출하거나 다시 활성화 함수가 호출될 때 네트워크 이벤트가 이미 발생한 경우 네트워크 이벤트가 기록되고 연결된 이벤트 개체가 적절하게 신호를 받습니다. 예를 들어 다음 시퀀스를 고려합니다.

  1. Windows 소켓 SPI 클라이언트는 LPWSPListen호출합니다.
  2. 연결 요청이 수신되었지만 아직 수락되지 않았습니다.
  3. Windows 소켓 SPI 클라이언트는 LPWSPEventSelect 호출하여 소켓에 대한 FD_ACCEPT 네트워크 이벤트에 관심이 있음을 지정합니다. 서비스 공급자는 FD_ACCEPT 네트워크 이벤트를 기록하고 연결된 이벤트 개체에 즉시 신호를 전송합니다.

FD_WRITE 네트워크 이벤트는 약간 다르게 처리됩니다. FD_WRITE 네트워크 이벤트는 소켓이 LPWSPConnect 처음 연결되거나 LPWSPAccept수락된 후 LPWSPSend 또는 LPWSPSendTo 실패하고 버퍼 공간을 사용할 수 있게 되면 기록됩니다. 따라서 Windows Sockets SPI 클라이언트는 첫 번째 FD_WRITE 네트워크 이벤트 설정부터 시작하여 송신이 WSAEWOULDBLOCK을 반환할 때까지 지속될 수 있다고 가정할 수 있습니다. 이러한 오류가 발생하면 Windows Sockets SPI 클라이언트는 FD_WRITE 네트워크 이벤트가 기록되고 연결된 이벤트 개체에 신호를 보낼 때 전송이 다시 가능하다는 것을 알게 됩니다.

FD_OOB 네트워크 이벤트는 소켓이 대역 외 데이터를 개별적으로 수신하도록 구성된 경우에만 사용됩니다. 소켓이 대역 외 데이터를 인라인으로 수신하도록 구성된 경우 대역 외(신속한) 데이터는 일반 데이터로 처리되고 Windows Sockets SPI 클라이언트는 네트워크 이벤트를 FD_OOB FD_READ 네트워크 이벤트에 대한 관심을 등록해야 합니다. Windows 소켓 SPI 클라이언트는 LPWSPSetSockOpt 사용하거나 SO_OOBINLINE 옵션에 대해 LPWSPGetSockOpt 사용하여 대역 외 데이터를 처리하는 방법을 설정하거나 검사할 수 있습니다.

FD_CLOSE 네트워크 이벤트의 오류 코드는 소켓 닫기가 정상인지 아니면 중단되었는지를 나타냅니다. 오류 코드가 0이면 닫기는 정상입니다. 오류 코드가 WSAECONNRESET이면 소켓의 가상 회로가 다시 설정됩니다. 이는 SOCK_STREAM 같은 연결 지향 소켓에만 적용됩니다.

FD_CLOSE 네트워크 이벤트는 소켓에 해당하는 가상 회로에 대한 닫기 표시가 수신될 때 기록됩니다. TCP 용어에서 이는 연결이 FIN WAIT 또는 CLOSE WAIT 상태로 전환될 때 FD_CLOSE 기록됨을 의미합니다. 그러면 원격 엔드가 송신 쪽에서 LPWSPShutdown 수행하거나 LPWSPCloseSocket수행합니다.

서비스 공급자는 가상 회로의 폐쇄를 나타내기 위해 FD_CLOSE 네트워크 이벤트를 기록해야 합니다. 해당 조건을 나타내기 위해 FD_READ 네트워크 이벤트를 기록하지 않아야 합니다.

FD_QOS 또는 FD_GROUP_QOS 네트워크 이벤트는 소켓 연결된 흐름 사양의 필드 또는 속한 소켓 그룹이 각각 변경된 경우 기록됩니다. 이 변경 내용은 SIO_GET_QOS 및/또는 SIO_GET_GROUP_QOS 있는 LPWSPIoctl 함수를 통해 Windows Sockets SPI 클라이언트에서 소켓 대한 현재 QOS를 검색하거나 속한 소켓 그룹에 대해 사용할 수 있어야 합니다.

FD_ROUTING_INTERFACE_CHANGE 네트워크 이벤트는 WSAIoctl 지정된 대상에 도달하는 데 사용해야 하는 로컬 인터페이스가 이러한 IOCTL이 발급된 후 변경된 SIO_ROUTING_INTERFACE_CHANGE 때 기록됩니다.

FD_ADDRESS_LIST_CHANGE 네트워크 이벤트는 SIO_ADDRESS_LIST_CHANGE 사용하여 WSAIoctl후 Windows Sockets SPI 클라이언트가 변경 내용을 바인딩할 수 있는 소켓 프로토콜 패밀리의 주소 목록이 기록됩니다.

요구 사항

요구
지원되는 최소 클라이언트 Windows 10 빌드 20348
지원되는 최소 서버 Windows 10 빌드 20348
헤더 ws2spi.h

참고 항목

LPWSPEnumNetworkEvents