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
설명자가 소켓이 아닙니다.

설명

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

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

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

이 함수는 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 Sockets SPI 클라이언트는 여전히 WSACloseEvent 를 호출하여 이벤트 개체를 명시적으로 닫고 리소스를 해제해야 합니다.

LPWSPAccept'ed 소켓은 수신 대기 소켓을 수락하는 데 사용되는 수신 대기 소켓과 동일한 속성을 가지기 때문에 수신 대기 소켓에 대해 설정된 모든 LPWSPEventSelect 연결 및 네트워크 이벤트 선택 항목이 허용된 소켓에 적용됩니다. 예를 들어 수신 대기 소켓에 hEventObject와 FD_ACCEPT, FD_READ 및 FD_WRITE 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 반환된 오류 코드가 WSATRY_AGAIN 조건 함수가 반환되었음을 나타내는 경우가 아니면 LPWSPAccept는 CF_DEFER
FD_CONNECT 없음
FD_CLOSE 없음
FD_QOS LPWSPIoctl 및 SIO_GET_QOS
FD_GROUP_QOS 소켓 그룹에서 나중에 사용하도록 예약됨: LPWSPIoctl 및 SIO_GET_GROUP_QOS
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 Sockets SPI 클라이언트가 이벤트 기반이 되는 동시에 한 번에 도착하는 데이터의 양에 대해 걱정하지 않을 수 있습니다. 다음과 같은 시퀀스를 고려해 보세요.

  1. 서비스 공급자는 소켓 s에서 100바이트의 데이터를 수신하고, FD_READ 네트워크 이벤트를 기록하며, 연결된 이벤트 개체에 신호를 보냅니다.
  2. Windows 소켓 SPI 클라이언트가 50바이트를 읽는 문제를 해결 WSPRecv(s, buffptr, 50, 0) 합니다.
  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 Sockets SPI 클라이언트가 SIO_ROUTING_INTERFACE_CHANGE 사용하여 WSAIoctl을 실행하여 알림을 요청한 변경이 발생하면 메시지가 정확히 한 번 게시되거나 그에 해당하는 SIO_ADDRESS_LIST_CHANGE. Windows 소켓 SPI 클라이언트가 IOCTL을 재발행 하고 IOCTL이 발급된 이후 다른 변경 내용이 검색될 때까지 추가 메시지가 나오지 않습니다.

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

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

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

FD_OOB 네트워크 이벤트는 소켓이 대역 외 데이터를 별도로 수신하도록 구성된 경우에만 사용됩니다. 소켓이 대역 외 데이터를 인라인으로 수신하도록 구성된 경우 대역 외(긴급) 데이터는 일반 데이터로 처리되고 Windows Sockets SPI 클라이언트는 네트워크 이벤트가 아닌 네트워크 이벤트에 대한 관심을 등록하고 네트워크 이벤트를 FD_OOB FD_READ 가져옵니다. Windows 소켓 SPI 클라이언트는 SO_OOBINLINE 옵션에 LPWSPSetSockOpt 또는 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 네트워크 이벤트는 WSAIoctl이 SIO_ADDRESS_LIST_CHANGE 실행된 Windows 소켓 SPI 클라이언트가 변경 내용을 바인딩할 수 있는 소켓 프로토콜 패밀리의 주소 목록이 기록됩니다.

요구 사항

요구 사항
지원되는 최소 클라이언트 Windows 10 빌드 20348
지원되는 최소 서버 Windows 10 빌드 20348
머리글 ws2spi.h

추가 정보

LPWSPEnumNetworkEvents