다음을 통해 공유


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 소켓 SPI 클라이언트는 LPWSPAsyncSelect를 호출하여 허용된 소켓 및 원하는 새 정보를 전달해야 합니다.

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

의미
FD_READ 소켓 읽을 준비가 됨
FD_WRITE 소켓 작성할 준비가 됨
FD_OOB 대역 외 데이터는 소켓에서 읽을 준비가 된 경우
FD_ACCEPT 소켓 새 들어오는 연결을 수락할 준비가 됨
FD_CONNECT 소켓에서 시작된 연결 완료되었습니다.
FD_CLOSE 소켓 s 로 식별된 연결이 닫혔습니다.
FD_QOS 소켓과 연결된 서비스 품질이 변경되었습니다.
FD_GROUP_QOS 소켓 그룹과 함께 나중에 사용할 수 있도록 예약됨: 소켓 이 속한 소 켓 그룹과 연결된 서비스 품질이 변경되었습니다.
FD_ROUTING_INTERFACE_CHANGE 지정된 대상으로 보내는 데 사용해야 하는 로컬 인터페이스가 변경되었습니다.
FD_ADDRESS_LIST_CHANGE Windows Sockets 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 Sockets SPI 클라이언트 창에 특정 이벤트의 알림을 성공적으로 게시한 후에는 Windows Sockets SPI 클라이언트가 해당 네트워크 이벤트에 대한 알림을 암시적으로 다시 사용하도록 설정하는 함수 호출을 수행할 때까지 해당 네트워크 이벤트에 대한 추가 메시지가 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 이벤트의 경우 메시지 게시가 수준 트리거됩니다. 즉, 다시 활성화 루틴이 호출되고 호출 후에도 관련 조건이 여전히 충족되는 경우 LPWSPAsyncSelect 메시지가 Windows 소켓 SPI 클라이언트에 게시됩니다.

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 소켓 SPI 클라이언트가 LPWSPAsyncSelect를 호출하거나 다시 활성화 함수가 호출될 때 이벤트가 이미 발생한 경우 메시지가 적절하게 게시됩니다. 예를 들어 다음 시퀀스를 고려합니다.

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

FD_WRITE 이벤트는 약간 다르게 처리됩니다. FD_WRITE 메시지는 소켓이 LPWSPConnect에 처음 연결되거나(FD_CONNECT 후 등록한 경우) LPWSPAccept에 수락된 후 LPWSPSend 또는 LPWSPSendTo가 실패하고 WSAEWOULDBLOCK 및 버퍼 공간을 사용할 수 있게 되면 게시됩니다. 따라서 Windows Sockets 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 게시됨을 의미합니다. 이렇게 하면 원격 엔드에서 송신 쪽 또는 LPWSPCloseSocket에서 LPWSPShutdown을 수행합니다. 소켓에서 모든 데이터를 읽은 후에만 FD_CLOSE 게시하는 것이 맞습니다.

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

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

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

FD_ADDRESS_LIST_CHANGE 메시지는 LPWSPIoctl에서 SIO_ADDRESS_LIST_CHANGE 실행한 Windows 소켓 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으로 실패하면 LPWSPSend 또는 LPWSPSendTo가 성공할 가능성이 높습니다.
  4. 연결 없는 소켓에서 LPWSPBind 이후. FD_WRITE 현재 발생할 수도 있으며 그렇지 않을 수도 있습니다(구현에 따라 다림질). 어떤 경우든 연결 없는 소켓은 항상 LPWSPBind 바로 다음에 쓸 수 있습니다.

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

  1. LPWSPAsyncSelect가 호출될 때 현재 MSG_OOB 플래그를 사용하여 수신할 수 있는 OOB 데이터가 있는 경우 입니다.
  2. OOB 데이터가 도착하면 FD_OOB 아직 게시되지 않은 경우 입니다.
  3. OOB 데이터를 계속 받을 수 있는 경우 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. 그룹 QOS가 변경되면 SIO_GET_GROUP_QOS LPWSPIoctl 이 호출된 후

FD_ROUTING_INTERFACE_CHANGE

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

FD_ADDRESS_LIST_CHANGE

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

요구 사항

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

추가 정보

LPWSPAsyncSelect 콜백 함수