LPWSPASYNCSELECT 콜백 함수(ws2spi.h)

LPWSPAsyncSelect 함수는 소켓에 대한 네트워크 이벤트의 Windows 메시지 기반 이벤트 알림을 요청합니다.

통사론

LPWSPASYNCSELECT Lpwspasyncselect;

int Lpwspasyncselect(
  [in]  SOCKET s,
  [in]  HWND hWnd,
  [in]  unsigned int wMsg,
  [in]  long lEvent,
  [out] LPINT lpErrno
)
{...}

매개 변수

[in] s

이벤트 알림이 필요한 소켓을 식별하는 설명자입니다.

[in] hWnd

네트워크 이벤트가 발생할 때 메시지를 받아야 하는 창을 식별하는 것을 처리합니다.

[in] wMsg

네트워크 이벤트가 발생할 때 보낼 메시지입니다.

[in] lEvent

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

애플리케이션 창에서 메시지를 받을 때 설정할 수 있는 추가 오류 코드(메시지 내의 lParam)에 대한 자세한 내용은 설명 참조하세요.

발언

이 함수는 서비스 공급자가 lEvent 인수로 지정된 네트워크 이벤트를 검색할 때마다 hWnd 클라이언트 창에 Windows 메시지를 보내도록 요청하는 데 사용됩니다. 서비스 공급자는 WPUPostMessage 함수를 사용하여 메시지를 게시해야 합니다. 보낼 메시지는 wMsg 매개 변수에 의해 지정됩니다. 알림이 필요한 소켓은 식별됩니다.

이 함수는 lEvent값에 관계없이 소켓 비블로킹 모드로 자동으로 설정합니다. 소켓을 다시 차단 모드로 설정하는 방법에 대한 LPWSPIoctl 참조하세요.

소켓에 대해 LPWSPAsyncSelect 호출하면 이전 LPWSPAsyncSelect 취소되거나 동일한 소켓에 대해 LPWSPEventSelect 취소됩니다. 예를 들어 읽기 및 쓰기 모두에 대한 알림을 받으려면 Windows Sockets SPI 클라이언트는 다음과 같이 FD_READ 및 FD_WRITE 모두 사용하여 LPWSPAsyncSelect 호출해야 합니다.

rc = WSPAsyncSelect(s, hWnd, wMsg, FD_READ | FD_WRITE, &error);

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

// Incorrect example.
rc = WSPAsyncSelect(s, hWnd, wMsg1, FD_READ, &error);
rc = WSPAsyncSelect(s, hWnd, wMsg2, FD_WRITE, &error);

모든 알림을 취소하려면(즉, 서비스 공급자가 소켓의 네트워크 이벤트와 관련된 메시지를 더 이상 보내지 않음을 나타내려면) lEvent 0으로 설정합니다.

rc = WSPAsyncSelect(s, hWnd, 0, 0, &error);

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

지정된 소켓 지정된 네트워크 이벤트 중 하나가 발생하면 서비스 공급자는 WPUPostMessage 사용하여 wMsg 메시지를 Windows Sockets SPI 클라이언트의 창 hWnd보냅니다. 게시된 메시지에서 wParam 인수는 네트워크 이벤트가 발생한 소켓을 식별합니다. lParam 소문은 발생한 네트워크 이벤트를 지정합니다. 표시될 수 있는 가능한 네트워크 이벤트 코드는 다음과 같습니다.

의미
FD_READ 소켓 읽을 준비가 됨
FD_WRITE 소켓 작성할 준비가 됨
FD_OOB 대역 외 데이터는 소켓 읽을 수 있습니다.
FD_ACCEPT 소켓 새 들어오는 연결을 수락할 준비가 됨
FD_CONNECT 소켓 시작된 연결이 완료되었습니다.
FD_CLOSE 소켓 식별된 연결이 닫혔습니다.
FD_QOS 소켓 연결된 서비스 품질이 변경되었습니다.
FD_GROUP_QOS 소켓 그룹과 함께 나중에 사용하도록 예약됨: 소켓 속한 소켓 그룹과 연결된 서비스 품질이 변경되었습니다.
FD_ROUTING_INTERFACE_CHANGE 지정된 대상으로 보내는 데 사용해야 하는 로컬 인터페이스가 변경되었습니다.
FD_ADDRESS_LIST_CHANGE Windows 소켓 SPI 클라이언트가 바인딩할 수 있는 소켓 프로토콜 패밀리의 주소 목록이 변경되었습니다.

lParam 상위 단어에는 오류 코드가 포함되어 있습니다(WSAGETSELECTERROR 매크로를 사용하여 추출할 수 있습니다). 오류 코드는 ws2spi.h정의된 오류입니다. 각 네트워크 이벤트에 대한 가능한 오류 코드는 다음 표에 나와 있습니다.

이벤트: FD_CONNECT

오류 코드 의미
WSAEAFNOSUPPORT
지정된 패밀리의 주소는 이 소켓과 함께 사용할 수 없습니다.
WSAECONNREFUSED
연결 시도가 거부되었습니다.
WSAENETUNREACH
현재 이 호스트에서 네트워크에 연결할 수 없습니다.
WSAEFAULT
namelen 매개 변수가 잘못되었습니다.
WSAEINVAL
소켓이 이미 주소에 바인딩되어 있습니다.
WSAEISCONN
소켓이 이미 연결되어 있습니다.
WSAEMFILE
더 이상 파일 설명자를 사용할 수 없습니다.
WSAENOBUFS
사용할 수 있는 버퍼 공간이 없습니다. 소켓을 연결할 수 없습니다.
WSAENOTCONN
소켓이 연결되지 않았습니다.
WSAETIMEDOUT
연결을 설정하지 않고 시간이 초과된 연결을 시도합니다.

이벤트: FD_CLOSE

오류 코드 의미
WSAENETDOWN
네트워크 하위 시스템이 실패했습니다.
WSAECONNRESET
원격 쪽에서 연결을 다시 설정했습니다.
WSAECONNABORTED
제한 시간 또는 기타 오류로 인해 연결이 종료되었습니다.

이벤트...: FD_ACCEPT, FD_ADDRESS_LIST_CHANGE, FD_GROUP_QOS, FD_OOB, FD_QOS, FD_READ, FD_WRITE

오류 코드 의미
WSAENETDOWN
네트워크 하위 시스템이 실패했습니다.

이벤트: FD_ROUTING_INTERFACE_CHANGE

오류 코드 의미
WSAENETUNREACH
지정된 대상에 더 이상 연결할 수 없습니다.
WSAENETDOWN
네트워크 하위 시스템이 실패했습니다.

LPWSPAsyncSelect 여러 이벤트에 관심을 가지고 호출할 수 있지만 서비스 공급자는 각 이벤트에 대해 동일한 Windows 메시지를 발급합니다.

Windows 소켓 2 공급자는 특정 네트워크 이벤트에 대한 메시지로 Windows 소켓 SPI 클라이언트를 지속적으로 플러시해서는 안 됩니다. Windows 소켓 SPI 클라이언트 창에 특정 이벤트의 알림을 성공적으로 게시한 후에는 Windows Sockets SPI 클라이언트가 해당 네트워크 이벤트에 대한 알림을 암시적으로 다시 사용하도록 설정하는 함수 호출을 수행할 때까지 해당 네트워크 이벤트에 대한 추가 메시지가 Windows 소켓 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 이벤트의 경우 메시지 게시는 수준 트리거. 즉, 다시 활성화 루틴이 호출되고 통화 후에도 관련 조건이 여전히 충족되는 경우 LPWSPAsyncSelect 메시지가 Windows 소켓 SPI 클라이언트에 게시됩니다.

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

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

Windows Sockets SPI 클라이언트가 LPWSPAsyncSelect호출하거나 다시 활성화 함수가 호출될 때 이벤트가 이미 발생한 경우 메시지가 적절하게 게시됩니다. 예를 들어 다음 시퀀스를 고려합니다.

  1. Windows 소켓 SPI 클라이언트는 LPWSPListen호출합니다.
  2. 연결 요청이 수신되었지만 아직 수락되지 않았습니다.
  3. Windows 소켓 SPI 클라이언트는 LPWSPAsyncSelect 소켓에 대한 FD_ACCEPT 메시지를 수신하도록 지정합니다. 이벤트의 지속성으로 인해 WinSock 서비스 공급자는 즉시 FD_ACCEPT 메시지를 게시합니다.

FD_WRITE 이벤트는 약간 다르게 처리됩니다. 소켓이 LPWSPConnect 처음 연결되면(FD_CONNECT 후) FD_WRITE 메시지가 게시됩니다. 등록되었거나 LPWSPAccept수락한 다음 LPWSPSend 또는 LPWSPSendTo WSAEWOULDBLOCK으로 실패하고 버퍼 공간을 사용할 수 있게 됩니다. 따라서 Windows 소켓 SPI 클라이언트는 첫 번째 FD_WRITE 메시지에서 시작하여 송신이 WSAEWOULDBLOCK을 반환할 때까지 지속될 수 있다고 가정할 수 있습니다. 이러한 오류가 발생하면 Windows 소켓 SPI 클라이언트에 FD_WRITE 메시지와 함께 전송이 다시 가능하다는 알림이 표시됩니다.

FD_OOB 이벤트는 대역 외 데이터를 개별적으로 수신하도록 소켓이 구성된 경우에만 사용됩니다. 소켓이 대역 외 데이터를 인라인으로 수신하도록 구성된 경우 대역 외(신속한) 데이터는 일반 데이터로 처리되고 Windows Sockets SPI 클라이언트는 FD_OOB 이벤트가 아닌 FD_READ 이벤트에 대한 관심을 등록해야 합니다.

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

FD_CLOSE 메시지는 소켓에 해당하는 가상 회로에 대한 닫기 표시가 수신될 때 게시됩니다. TCP 용어에서 이는 연결이 TIME WAIT 또는 CLOSE WAIT 상태로 전환될 때 FD_CLOSE 게시됨을 의미합니다. 그러면 원격 엔드가 송신 쪽에서 LPWSPShutdown 수행하거나 LPWSPCloseSocket. 소켓에서 모든 데이터를 읽은 후에만 FD_CLOSE 게시하는 것이 맞습니다.

정상적인 종료의 경우 서비스 공급자는 수신된 모든 데이터를 읽은 후에만 가상 회로 폐쇄를 나타내는 FD_CLOSE 메시지를 보내야 합니다. 이 조건을 나타내기 위해 FD_READ 메시지를 보내면 안 됩니다.

FD_QOS 또는 FD_GROUP_QOS 메시지는 소켓 연결된 흐름 사양의 필드 또는 속한 소켓 그룹이 각각 변경된 경우 게시됩니다. 서비스 공급자는 SIO_GET_QOS 및/또는 SIO_GET_GROUP_QOS LPWSPIoctl 통해 클라이언트에서 사용할 수 있는 QOS 정보를 업데이트해야 합니다.

FD_ROUTING_INTERFACE_CHANGE 메시지는 LPWSPIoctl 지정된 대상에 도달하는 데 사용해야 하는 로컬 인터페이스가 이러한 IOCTL이 발급된 후 SIO_ROUTING_INTERFACE_CHANGE 변경 내용이 때 게시됩니다.

FD_ADDRESS_LIST_CHANGE 메시지는 SIO_ADDRESS_LIST_CHANGE 사용하여 LPWSPIoctl후 Windows Sockets SPI 클라이언트가 변경 내용을 바인딩할 수 있는 주소 목록이 게시됩니다.

다음은 각 비동기 알림 메시지의 이벤트 및 조건에 대한 요약입니다.

FD_READ

  1. LPWSPAsyncSelect 호출되는 경우 현재 받을 수 있는 데이터가 있는 경우
  2. 데이터가 도착하면 FD_READ 아직 게시되지 않은 경우
  3. LPWSPRecv 또는 LPWSPRecvFrom 호출(MSG_PEEK 유무)한 후에도 데이터를 계속 받을 수 있는 경우 호출됩니다.

LPWSPSetSockOpt SO_OOBINLINE 사용하도록 설정하면 데이터 위에서 설명한 인스턴스에 일반 데이터와 OOB(대역 외) 데이터가 모두 포함됩니다.

FD_WRITE

  1. LPWSPAsyncSelect 호출되는 경우 LPWSPSend 또는 LPWSPSendTo 가능합니다.
  2. LPWSPConnect 또는 LPWSPAccept 후 연결이 설정되면 호출됩니다.
  3. LPWSPSend 또는 LPWSPSendTo가 WSAEWOULDBLOCK에서 실패할 있는 경우 LPWSPSendTo 또는 LPWSPSendTo 성공할 가능성이 높습니다.
  4. LPWSPBind를 후 연결 없는 소켓에서. FD_WRITE 현재 발생할 수도 있으며 그렇지 않을 수도 있습니다(구현에 따라 다름). 어쨌든 연결 없는 소켓은 LPWSPBind직후에 항상 쓸 수 있습니다.

FD_OOB(LPWSPSetSockOpt SO_OOBINLINE 사용하지 않도록 설정된 경우에만 유효합니다(기본값).

  1. LPWSPAsyncSelect 호출되는 경우 현재 MSG_OOB 플래그를 사용하여 수신할 수 있는 OOB 데이터가 있는 경우
  2. OOB 데이터가 도착하면 FD_OOB 아직 게시되지 않은 경우
  3. 후 LPWSPRecv 또는 LPWSPRecvFrom MSG_OOB 플래그를 사용하거나 사용하지 않고 호출됩니다.

FD_ACCEPT

  1. LPWSPAsyncSelect 호출되는 경우 현재 수락할 수 있는 연결 요청이 있는 경우
  2. 연결 요청이 도착하면 FD_ACCEPT 아직 게시되지 않은 경우
  3. LPWSPAccept 호출된 후 수락할 수 있는 다른 연결 요청이 있는 경우

FD_CONNECT

  1. LPWSPAsyncSelect 호출되는 경우 현재 설정된 연결이 있는 경우
  2. LPWSPConnect 호출된 후 연결이 설정되면(데이터그램 소켓에서 일반적인 것처럼 LPWSPConnect 즉시 성공하는 경우에도) 즉시 실패할 때도 발생합니다.
  3. WSPJoinLeaf 호출되면 조인 작업이 완료됩니다.
  4. 연결, WSAConnect또는 WSPJoinLeaf 비차단 연결 지향 소켓으로 호출되었습니다. 초기 작업은 WSAEWOULDBLOCK의 특정 오류와 함께 반환되었지만 네트워크 작업이 진행되었습니다. 작업이 최종적으로 성공하는지 여부, 결과가 결정되면 FD_CONNECT 발생합니다. 클라이언트는 오류 코드를 확인하여 결과가 성공 또는 실패인지 확인해야 합니다.

FD_CLOSE(연결 지향 소켓(예: SOCK_STREAM)에서만 유효)

  1. LPWSPAsyncSelect 호출되면 소켓 연결이 닫혔습니다.
  2. 원격 시스템이 정상 종료를 시작한 후 현재 수신할 수 있는 데이터가 없는 경우(원격 시스템이 정상 종료를 시작할 때 데이터를 수신하고 읽기를 기다리는 경우 보류 중인 모든 데이터를 읽을 때까지 FD_CLOSE 전달되지 않음).
  3. 로컬 시스템이 LPWSPShutdown 정상 종료를 시작하고 원격 시스템이 현재 받을 수 있는 데이터가 없는 경우 데이터 끝 알림(예: TCP FIN)으로 응답한 후
  4. 원격 시스템에서 연결을 중단하는 경우(예: 전송된 TCP RST) lParam WSAECONNRESET 오류 값이 포함됩니다.

LPWSPCloseSocket 호출된 후에는 FD_CLOSE 게시되지 않습니다.

FD_QOS

  1. LPWSPAsyncSelect 호출되면 소켓과 연결된 QOS가 변경된 경우입니다.
  2. SIO_GET_QOS LPWSPIoctl 호출되면 QOS가 변경됩니다.

FD_GROUP_QOS

소켓 그룹에서 나중에 사용하도록 예약됨:

  1. LPWSPAsyncSelect 호출되면 소켓과 연결된 그룹 QOS가 변경된 경우입니다.
  2. SIO_GET_GROUP_QOS LPWSPIoctl 호출되면 그룹 QOS가 변경됩니다.

FD_ROUTING_INTERFACE_CHANGE

  1. SIO_ROUTING_INTERFACE_CHANGE LPWSPIoctl 호출된 후 IOCTL에 지정된 대상에 도달하는 데 사용해야 하는 로컬 인터페이스가 변경될 때 호출됩니다.

FD_ADDRESS_LIST_CHANGE

  1. SIO_ADDRESS_LIST_CHANGE LPWSPIoctl 호출되면 Windows 소켓 SPI 클라이언트가 변경 내용을 바인딩할 수 있는 로컬 주소 목록이 호출됩니다.

요구 사항

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

참고 항목

LPWSPAsyncSelect 콜백 함수