PFN_WSK_ACCEPT 콜백 함수(wsk.h)

WskAccept 함수는 수신 대기 소켓에서 들어오는 연결을 허용합니다.

구문

PFN_WSK_ACCEPT PfnWskAccept;

NTSTATUS PfnWskAccept(
  [in]            PWSK_SOCKET ListenSocket,
                  ULONG Flags,
  [in, optional]  PVOID AcceptSocketContext,
  [in, optional]  const WSK_CLIENT_CONNECTION_DISPATCH *AcceptSocketDispatch,
  [out, optional] PSOCKADDR LocalAddress,
  [out, optional] PSOCKADDR RemoteAddress,
  [in, out]       PIRP Irp
)
{...}

매개 변수

[in] ListenSocket

들어오는 연결을 확인하려는 수신 대기 또는 스트림 소켓의 소켓 개체를 지정하는 WSK_SOCKET 구조체에 대한 포인터입니다.

Flags

이 매개 변수는 시스템 사용을 위해 예약되어 있습니다. WSK 애플리케이션은 이 매개 변수를 0으로 설정해야 합니다.

[in, optional] AcceptSocketContext

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

[in, optional] AcceptSocketDispatch

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

[out, optional] LocalAddress

들어오는 연결이 도착한 로컬 전송 주소를 수신하는 호출자가 할당한 버퍼에 대한 포인터입니다. 버퍼는 페이징되지 않은 메모리에 있어야 합니다. 또한 버퍼는 WSK 애플리케이션이 수신 대기 소켓을 만들 때 지정한 주소 패밀리에 해당하는 특정 SOCKADDR 구조 형식을 포함할 만큼 충분히 커야 합니다. 이 포인터는 선택 사항이며 NULL일 수 있습니다.

[out, optional] RemoteAddress

들어오는 연결이 시작된 원격 전송 주소를 수신하는 호출자가 할당한 버퍼에 대한 포인터입니다. 버퍼는 페이징되지 않은 메모리에 있어야 합니다. 또한 버퍼는 WSK 애플리케이션이 수신 대기 소켓을 만들 때 지정한 주소 패밀리에 해당하는 특정 SOCKADDR 구조 형식을 포함할 만큼 충분히 커야 합니다. 이 포인터는 선택 사항이며 NULL일 수 있습니다.

[in, out] Irp

WSK 하위 시스템이 수락 작업을 비동기적으로 완료하는 데 사용하는 호출자 할당 IRP에 대한 포인터입니다. WSK 함수와 함께 IRP를 사용하는 방법에 대한 자세한 내용은 Winsock 커널 함수에서 IRP 사용을 참조하세요.

반환 값

WskAccept 는 다음 NTSTATUS 코드 중 하나를 반환합니다.

반환 코드 설명
STATUS_SUCCESS
들어오는 연결이 성공적으로 수락되었습니다. IRP는 성공 상태 완료됩니다.
STATUS_PENDING
IRP는 수신 대기 소켓에서 들어오는 연결을 기다리는 WSK 하위 시스템에 의해 큐에 대기되었습니다.
STATUS_FILE_FORCED_CLOSED
소켓이 더 이상 작동하지 않습니다. IRP는 실패 상태 완료됩니다. WSK 애플리케이션은 WskCloseSocket 함수를 호출하여 가능한 한 빨리 소켓을 닫아야 합니다.
기타 상태 코드
오류가 발생했습니다. IRP는 실패 상태 완료됩니다.

설명

WSK 애플리케이션은 WskBind 함수를 호출하여 이전에 로컬 전송 주소에 바인딩된 수신 대기 소켓 또는 스트림 소켓에서 WskAccept 함수를 호출할 수 있습니다.

WskAccept 함수의 동작은 들어오는 연결이 수신 대기 소켓에서 수락되기를 기다리고 있는지 여부에 따라 달라집니다.

  • 들어오는 연결이 수신 대기 소켓에 이미 도착하여 수락되기를 기다리는 경우 WskAccept 함수는 STATUS_SUCCESS 반환합니다. 이 경우 IRP는 성공 상태 완료되고 IRP의 IoStatus.Information 필드에는 허용된 소켓에 대한 소켓 개체에 대한 포인터가 포함됩니다.
  • 수신 대기 소켓에서 들어오는 연결이 수락되기를 기다리지 않는 경우 WskAccept 는 STATUS_PENDING 반환하고 WSK 하위 시스템은 들어오는 연결이 수신될 때까지 IRP를 큐에 대기합니다. 들어오는 연결이 수신되면 WSK 하위 시스템은 성공 상태 IRP를 비동기적으로 완료합니다. 이 경우 IRP의 IoStatus.Information 필드에는 허용되는 소켓에 대한 소켓 개체에 대한 포인터가 포함됩니다.
WSK 애플리케이션의 WskAcceptEvent 이벤트 콜백 함수가 수신 대기 소켓에서 활성화되고 애플리케이션이 동일한 수신 대기 소켓에서 WskAccept 함수에 대한 보류 중인 호출이 있는 경우 들어오는 연결이 도착하면 WskAccept 에 대한 보류 중인 호출이 WskAcceptEvent 이벤트 콜백 함수보다 우선합니다. WSK 하위 시스템은 WskAccept에 대한 보류 중인 호출에서 대기 중인 IRP가 없는 경우에만 애플리케이션의 WskAcceptEvent 이벤트 콜백 함수를 호출합니다. 그러나 WSK 애플리케이션은 WSK 하위 시스템이 WskAccept 함수에 대한 보류 중인 호출이 있는 수신 대기 소켓에 대해 애플리케이션의 WskAcceptEvent 이벤트 콜백 함수를 호출하지 않는다고 가정해서는 안 됩니다. WSK 하위 시스템이 여전히 소켓에 대한 WSK 애플리케이션의 WskAcceptEvent 이벤트 콜백 함수를 호출할 수 있는 경합 조건이 존재합니다. WSK 애플리케이션이 WSK 하위 시스템이 수신 대기 소켓에 대해 애플리케이션의 WskAcceptEvent 이벤트 콜백 함수를 호출하지 않도록 하는 유일한 방법은 소켓에서 애플리케이션의 WskAcceptEvent 이벤트 콜백 함수를 사용하지 않도록 설정하는 것입니다.

WskAccept 함수가 들어오는 연결을 성공적으로 수락하면 수락된 소켓의 모든 이벤트 콜백 함수가 기본적으로 사용하지 않도록 설정됩니다. 허용되는 소켓의 이벤트 콜백 함수를 사용하도록 설정하는 방법에 대한 자세한 내용은 이벤트 콜백 함수 사용 및 비활성화를 참조하세요.

WSK 애플리케이션이 LocalAddress 매개 변수, RemoteAddress 매개 변수 또는 두 매개 변수 모두에서 NULL이 아닌 포인터를 지정하고 WskAccept가 STATUS_PENDING 반환하는 경우 IRP가 완료될 때까지 해당 매개 변수가 가리키는 버퍼가 유효한 상태로 유지되어야 합니다. WSK 애플리케이션이 ExAllocateXxx 함수 중 하나를 사용하여 버퍼를 할당한 경우 IRP가 완료될 때까지 해당 ExFreeXxx 함수로 메모리를 해제할 수 없습니다. WSK 애플리케이션이 스택에 버퍼를 할당한 경우 IRP가 완료될 때까지 WskAccept 함수를 호출하는 함수에서 반환할 수 없습니다.

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

요구 사항

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

추가 정보

SOCKADDR

WSK_CLIENT_CONNECTION_DISPATCH

WSK_PROVIDER_LISTEN_DISPATCH

WSK_PROVIDER_STREAM_DISPATCH

WSK_SOCKET

WskAcceptEvent

WskBind

WskCloseSocket

WskSocket