다음을 통해 공유


PFN_WSK_ACCEPT_EVENT 콜백 함수(wsk.h)

WskAcceptEvent 이벤트 콜백 함수는 WSK 애플리케이션에 수신 대기 소켓의 들어오는 연결이 수락되었음을 알 수 있습니다.

구문

PFN_WSK_ACCEPT_EVENT PfnWskAcceptEvent;

NTSTATUS PfnWskAcceptEvent(
  [in, optional] PVOID SocketContext,
  [in]           ULONG Flags,
  [in]           PSOCKADDR LocalAddress,
  [in]           PSOCKADDR RemoteAddress,
  [in, optional] PWSK_SOCKET AcceptSocket,
  [out]          PVOID *AcceptSocketContext,
  [out]          const WSK_CLIENT_CONNECTION_DISPATCH **AcceptSocketDispatch
)
{...}

매개 변수

[in, optional] SocketContext

들어오는 연결이 수락된 수신 대기 소켓의 소켓 컨텍스트에 대한 포인터입니다. WSK 애플리케이션은 WskSocket 함수를 호출하여 수신 대기 소켓을 만들 때 WSK 하위 시스템에 대한 이 포인터를 제공했습니다.

[in] Flags

다음 플래그를 포함하는 ULONG 값 또는 0입니다.

WSK_FLAG_AT_DISPATCH_LEVEL

IRQL = DISPATCH_LEVEL WskAcceptEvent 이벤트 콜백 함수라는 WSK 하위 시스템입니다. 이 플래그가 설정되지 않은 경우 WSK 하위 시스템은 IRQL <= DISPATCH_LEVEL WskAcceptEvent 이벤트 콜백 함수를 호출했을 수 있습니다.

[in] LocalAddress

들어오는 연결이 도착한 로컬 전송 주소를 포함하는 버퍼에 대한 포인터입니다. 버퍼에는 WSK 애플리케이션이 수신 대기 소켓을 만들 때 지정한 주소 패밀리에 해당하는 특정 SOCKADDR 구조 유형이 포함됩니다.

[in] RemoteAddress

들어오는 연결이 시작된 원격 전송 주소를 포함하는 버퍼에 대한 포인터입니다. 버퍼에는 WSK 애플리케이션이 수신 대기 소켓을 만들 때 지정한 주소 패밀리에 해당하는 특정 SOCKADDR 구조 유형이 포함됩니다.

[in, optional] AcceptSocket

허용되는 소켓의 소켓 개체인 WSK_SOCKET 구조체에 대한 포인터입니다. 이 포인터가 NULL이면 수신 대기 소켓이 더 이상 작동하지 않으며 WSK 애플리케이션은 WskCloseSocket 함수를 호출하여 가능한 한 빨리 수신 대기 소켓을 닫아야 합니다.

[out] AcceptSocketContext

허용되는 소켓에 대해 WSK 애플리케이션 제공 컨텍스트에 대한 포인터를 수신하는 변수에 대한 포인터입니다. WSK 하위 시스템은 허용된 소켓의 이벤트 콜백 함수에 이 포인터를 전달합니다. 컨텍스트 정보는 WSK 하위 시스템에 불투명하며 페이징되지 않은 메모리에 저장되어야 합니다. WSK 애플리케이션이 허용되는 소켓에서 이벤트 콜백 함수를 사용하도록 설정하지 않는 경우 애플리케이션은 AcceptSocketContext 매개 변수가 가리키는 변수를 NULL로 설정해야 합니다.

[out] AcceptSocketDispatch

상수에 대한 포인터를 받는 변수에 대한 포인터 WSK_CLIENT_CONNECTION_DISPATCH 구조체입니다. 이 구조체는 허용되는 소켓에 대한 이벤트 콜백 함수에 대한 포인터를 포함하는 디스패치 테이블입니다. WSK 애플리케이션이 허용되는 소켓에 대해 모든 이벤트 콜백 함수를 사용하도록 설정하지 않는 경우 애플리케이션은 사용하도록 설정하지 않는 이벤트 콜백 함수에 대해 디스패치 테이블의 포인터를 NULL 로 설정해야 합니다. WSK 애플리케이션이 허용되는 소켓에서 이벤트 콜백 함수를 사용하도록 설정하지 않는 경우 AcceptSocketDispatch 매개 변수가 가리키는 변수를 NULL로 설정해야 합니다.

반환 값

WSK 애플리케이션의 WskAcceptEvent 이벤트 콜백 함수는 다음 NTSTATUS 코드 중 하나를 반환할 수 있습니다.

반환 코드 설명
STATUS_SUCCESS
WSK 애플리케이션이 들어오는 연결을 수락했습니다.
STATUS_REQUEST_NOT_ACCEPTED
WSK 애플리케이션이 들어오는 연결을 거부했습니다. 이 값이 반환되면 WSK 하위 시스템은 WSK 애플리케이션을 대신하여 허용된 소켓을 닫습니다.

설명

WSK 하위 시스템은 수신 대기 소켓에서 들어오는 연결이 허용될 때 이전에 SO_WSK_EVENT_CALLBACK 소켓 옵션을 사용하여 이벤트 콜백 함수를 사용하도록 설정한 경우에만 WSK 애플리케이션의 WskAcceptEvent 이벤트 콜백 함수를 호출합니다. 소켓의 이벤트 콜백 함수를 사용하도록 설정하는 방법에 대한 자세한 내용은 이벤트 콜백 함수 사용 및 비활성화를 참조하세요.

WSK 애플리케이션의 WskAcceptEvent 이벤트 콜백 함수가 수신 대기 소켓에서 사용하도록 설정되어 있고 애플리케이션이 동일한 수신 대기 소켓에서 WskAccept 함수에 대한 보류 중인 호출이 있는 경우 들어오는 연결이 도착하면 WskAccept 에 대한 보류 중인 호출이 WskAcceptEvent 이벤트 콜백 함수보다 우선합니다. WSK 하위 시스템은 WskAccept 함수에 대한 보류 중인 호출에서 큐에 대기 중인 IRP가 없는 경우에만 애플리케이션의 WskAcceptEvent 이벤트 콜백 함수를 호출합니다. 그러나 WSK 애플리케이션은 WSK 하위 시스템이 WskAccept 함수에 대한 보류 중인 호출이 있는 수신 대기 소켓에 대해 애플리케이션의 WskAcceptEvent 이벤트 콜백 함수를 호출하지 않는다고 가정해서는 안 됩니다. WSK 하위 시스템이 소켓에 대한 WSK 애플리케이션의 WskAcceptEvent 이벤트 콜백 함수를 계속 호출할 수 있는 경합 조건이 존재합니다. WSK 애플리케이션이 WSK 하위 시스템이 수신 대기 소켓에 대한 애플리케이션의 WskAcceptEvent 이벤트 콜백 함수를 호출하지 않도록 하는 유일한 방법은 소켓에서 애플리케이션의 WskAcceptEvent 이벤트 콜백 함수를 사용하지 않도록 설정하는 것입니다.

WSK 하위 시스템이 WSK 애플리케이션의 WskAcceptEvent 이벤트 콜백 함수를 호출하는 경우 허용되는 소켓의 모든 이벤트 콜백 함수는 기본적으로 사용하지 않도록 설정됩니다. WSK 애플리케이션이 수신 대기 소켓에서 연결 지향 소켓 이벤트 콜백 함수를 사용하도록 설정하는 경우 해당 수신 대기 소켓에서 허용되는 모든 연결 지향 소켓에서 이러한 이벤트 콜백 함수가 기본적으로 사용하도록 설정됩니다. 허용되는 소켓의 이벤트 콜백 함수를 사용하도록 설정하는 방법에 대한 자세한 내용은 이벤트 콜백 함수 사용 및 비활성화를 참조하세요.

LocalAddressRemoteAddress 매개 변수가 가리키는 SOCKADDR 구조체는 WskAcceptEvent 이벤트 콜백 함수를 호출하는 동안에만 유효합니다. 나중에 WSK 애플리케이션에 이러한 전송 주소가 필요한 경우 WskAcceptEvent 이벤트 콜백 함수에서 반환하기 전에 이러한 구조체의 내용을 자체 SOCKADDR 구조체에 복사하거나 나중에 수락된 소켓에서 WskGetLocalAddressWskGetRemoteAddress 함수를 호출할 수 있습니다.

WSK 하위 시스템은 WSK 애플리케이션을 대신하여 허용된 연결에 대해 소켓 개체 구조( WSK_SOCKET)에 대한 메모리를 할당합니다. WSK 하위 시스템은 소켓이 닫혀 있을 때 이 메모리의 할당을 취소합니다.

WSK 하위 시스템은 IRQL <= DISPATCH_LEVEL WSK 애플리케이션의 WskAcceptEvent 이벤트 콜백 함수를 호출합니다.

WSK 애플리케이션의 WskAcceptEvent 이벤트 콜백 함수는 WSK 완료 또는 이벤트 콜백 함수의 컨텍스트에서 다른 WSK 요청이 완료될 때까지 기다리지 않아야 합니다. 콜백은 다른 WSK 요청을 시작할 수 있지만(DISPATCH_LEVEL 시간이 너무 많이 소요되지 않는다고 가정) 콜백이 IRQL = PASSIVE_LEVEL 호출되는 경우에도 완료될 때까지 기다리지 않아야 합니다.

요구 사항

요구 사항
지원되는 최소 클라이언트 Windows Vista 이상 버전의 Windows 운영 체제에서 사용할 수 있습니다.
대상 플랫폼 Windows
헤더 wsk.h(Wsk.h 포함)
IRQL <= DISPATCH_LEVEL

추가 정보

SOCKADDR

WSK_CLIENT_CONNECTION_DISPATCH

WSK_CLIENT_LISTEN_DISPATCH

WSK_SOCKET

WskAccept

WskCloseSocket

WskControlSocket

WskGetLocalAddress

WskGetRemoteAddress

WskSocket