다음을 통해 공유


LPWSPACCEPT 콜백 함수(ws2spi.h)

LPWSPAccept 함수는 조건 함수의 반환 값에 따라 연결을 조건부로 허용합니다.

구문

LPWSPACCEPT Lpwspaccept;

SOCKET Lpwspaccept(
  [in]      SOCKET s,
  [out]     sockaddr *addr,
  [in, out] LPINT addrlen,
  [in]      LPCONDITIONPROC lpfnCondition,
  [in]      DWORD_PTR dwCallbackData,
  [out]     LPINT lpErrno
)
{...}

매개 변수

[in] s

LPWSPListen 이후 연결을 수신 대기하는 소켓을 식별하는 설명자입니다.

[out] addr

서비스 공급자에 알려진 연결 엔터티의 주소를 수신하는 버퍼에 대한 선택적 포인터입니다. addr 매개 변수의 정확한 형식은 sockaddr 구조체의 소켓을 만들 때 설정된 주소 패밀리에 의해 결정됩니다.

[in, out] addrlen

addr 매개 변수의 길이(바이트)를 포함하는 정수에 대한 선택적 포인터입니다.

[in] lpfnCondition

프로시저 instance Windows 소켓에서 제공하는 선택적 조건 함수의 주소입니다. 이 함수는 매개 변수로 전달된 호출자 정보에 따라 수락 또는 거부 결정에 사용됩니다.

[in] dwCallbackData

조건 함수의 dwCallbackData 매개 변수 값으로 Windows Socket 2 클라이언트에 다시 전달될 콜백 데이터입니다. 이 매개 변수는 서비스 공급자가 해석하지 않습니다.

[out] lpErrno

오류 코드에 대한 포인터입니다.

반환 값

오류가 발생하지 않으면 LPWSPAccept 는 허용되는 소켓에 대한 설명자인 SOCKET 형식의 값을 반환합니다. 그렇지 않으면 INVALID_SOCKET 값이 반환되고 lpErrno에서 특정 오류 코드를 사용할 수 있습니다.

오류 코드 의미
WSAECONNREFUSED
조건 함수(CF_REJECT)의 반환 값에 표시된 대로 연결 요청이 강제로 거부되었습니다.
WSAECONNRESET
들어오는 연결이 표시되었지만 호출을 수락하기 전에 원격 피어에 의해 종료되었습니다.
WSAENETDOWN
네트워크 하위 시스템이 실패했습니다.
WSAEFAULT
addrlen 매개 변수가 너무 작거나 lpfnCondition 매개 변수가 사용자 주소 공간의 일부가 아닙니다.
WSAEINTR
LPWSPCancelBlockingCall을 통해 (차단) 호출이 취소되었습니다.
WSAEINPROGRESS
차단 Windows 소켓 호출이 진행 중입니다.
WSAEINVAL
LPWSPListen 이 LPWSPAccept 이전에 호출되지 않았거나, 조건 함수에 지정된 매개 변수 g 가 유효한 값이 아니거나, 조건 함수의 반환 값이 유효하지 않거나, 지정된 소켓이 잘못된 상태인 경우입니다.
WSAEMFILE
큐는 LPWSPAccept에 입력할 때 아무 것도 없으며 사용할 수 있는 소켓 설명자가 없습니다.
WSAENOBUFS
사용할 수 있는 버퍼 공간이 없습니다.
WSAENOTSOCK
설명자가 소켓이 아닙니다.
WSAEOPNOTSUPP
참조된 소켓은 연결 지향 서비스를 지원하는 형식이 아닙니다.
WSATRY_AGAIN
연결 요청 수락은 조건 함수(CF_DEFER)의 반환 값에 표시된 대로 지연되었습니다.
WSAEWOULDBLOCK
소켓은 차단 해제로 표시되며 수락할 연결이 없습니다.
WSAEACCES
제공된 연결 요청의 시간이 초과되었거나 철회되었습니다.

설명

LPWSPAccept 함수는 소켓의 보류 중인 연결 큐에서 첫 번째 연결을 추출하고 조건 함수가 지정된 경우(즉, null이 아닌) 조건 함수에 대해 확인합니다. 조건 함수는 이 루틴과 동일한 스레드에서 실행되어야 합니다. 조건 함수가 CF_ACCEPT 반환하는 경우 LPWSPAccept 는 새 소켓을 만듭니다.

새로 만든 소켓에는 LPWSPAsyncSelect 또는 LPWSPEventSelect에 등록된 네트워크 이벤트를 포함하여 소켓과 동일한 속성이 있습니다. DescriptorAllocation에 설명된 대로 새 소켓 설명자가 할당되면 IFS 공급자는 WPUModifyIFSHandle을 호출해야 하며 비 IFS 공급자는 WPUCreateSocketHandle을 호출해야 합니다.

조건 함수가 CF_REJECT 반환하는 경우 LPWSPAccept 는 연결 요청을 거부합니다. 애플리케이션의 수락/거부 결정을 즉시 수행할 수 없는 경우 조건 함수는 CF_DEFER 반환하여 결정이 내려지지 않았음을 나타냅니다. 이 연결 요청에 대한 작업은 서비스 공급자가 수행할 수 없습니다. 애플리케이션이 연결 요청에 대한 작업을 수행할 준비가 되면 LPWSPAccept 를 다시 호출하고 조건 함수에서 반환 값으로 CF_ACCEPT 또는 CF_REJECT 반환합니다.

(기본값) 차단 모드에 있는 소켓의 경우 큐에 보류 중인 연결이 없는 경우 LPWSPAccept 는 연결이 있을 때까지 호출자를 차단합니다. 비블로킹 모드의 소켓의 경우 큐에 보류 중인 연결이 없을 때 이 함수가 호출되면 LPWSPAccept오류 코드 WSAEWOULDBLOCK을 반환합니다. 허용된 소켓은 더 많은 연결을 수락하는 데 사용할 수 없습니다. 원래 소켓은 열린 상태로 유지됩니다.

매개 변수 addr 는 서비스 공급자에 알려진 연결 엔터티의 주소로 채워진 결과 매개 변수입니다. addr 매개 변수의 정확한 형식은 통신이 발생하는 주소 패밀리에 의해 결정됩니다. addrlen은 값 결과 매개 변수입니다. 처음에는 추가 도구가 가리키는 공간의 양을 포함합니다. 반환할 때 서비스 공급자가 반환하는 주소의 실제 길이(바이트)를 포함해야 합니다. 이 호출은 SOCK_STREAM 같은 연결 지향 소켓 유형에 사용됩니다. addr 및/또는 addrlen이 null과 같으면 허용된 소켓의 원격 주소에 대한 정보가 반환되지 않습니다. 그렇지 않으면 조건 함수가 지정되었는지 또는 반환되는지에 관계없이 이러한 두 매개 변수가 채워집니다.

조건 함수의 프로토타입은 다음과 같습니다.

int CALLBACK 
ConditionFunc( 
  IN     LPWSABUF    lpCallerId, 
  IN     LPWSABUF    lpCallerData, 
  IN OUT LPQOS       lpSQOS, 
  IN OUT LPQOS       lpGQOS,
  IN     LPWSABUF    lpCalleeId, 
  IN     LPWSABUF    lpCalleeData, 
  OUT    GROUP FAR * g, 	
  IN     DWORD_PTR   dwCallbackData
);

lpCallerIdlpCallerData는 연결 엔터티의 주소와 연결 요청과 함께 전송된 모든 사용자 데이터를 포함해야 하는 값 매개 변수입니다. 호출자 식별자 또는 호출자 데이터를 사용할 수 없는 경우 해당 매개 변수는 null이 됩니다. 대부분의 네트워크 프로토콜은 연결 시간 호출자 데이터를 지원하지 않습니다. 대부분의 기존 네트워크 프로토콜은 연결 요청 시간에 호출자 식별자 정보를 지원할 것으로 예상할 수 있습니다. lpCallerId가 가리키는 WSABUFbuf 부분은 sockaddr를 가리킵니다. sockaddr는 주소 패밀리에 따라 해석됩니다(일반적으로 sockaddr를 주소 패밀리와 관련된 일부 형식으로 캐스팅).

lpSQOS 매개 변수는 호출자가 지정한 소켓 흐름 사양을 참조하며, 각 방향에 대해 하나씩, 추가 공급자별 매개 변수를 참조합니다. 전송 또는 수신 흐름 사양 값은 단방향 소켓에 대해 적절하게 무시됩니다. lpSQOS에 대한 null 값은 호출자가 제공한 QoS가 없고 협상이 가능하지 않음을 나타냅니다. NULL이 아닌 lpSQOS 포인터는 QoS 협상이 발생하거나 공급자가 협상 없이 QoS 요청을 수락할 준비가 되었음을 나타냅니다.

lpCalleeId는 연결된 엔터티의 로컬 주소를 포함하는 값 매개 변수입니다. lpCalleeId가 가리키는 WSABUFbuf 부분은 sockaddr를 가리킵니다. sockaddr는 주소 패밀리에 따라 해석됩니다(일반적으로 sockaddr를 주소 패밀리와 관련된 일부 형식으로 캐스팅).

lpCalleeData는 조건 함수에서 사용자 데이터를 연결 엔터티에 다시 제공하는 데 사용하는 결과 매개 변수입니다. 이 데이터의 스토리지는 서비스 공급자가 제공해야 합니다. lpCalleeData-len>은 처음에 서비스 공급자가 할당하고 lpCalleeData-buf>가 가리키는 버퍼의 길이를 포함합니다. 값이 0이면 사용자 데이터를 호출자에게 다시 전달하는 것은 지원되지 않습니다. 조건 함수는 lpCalleeData-len 바이트의 데이터를 lpCalleeData-buf>>로 복사한 다음lpCalleeData-len>을 업데이트하여 전송된 실제 바이트 수를 나타냅니다. 호출자에게 다시 전달할 사용자 데이터가 없는 경우 조건 함수는 lpCalleeData-len>을 0으로 설정합니다. 모든 주소 및 사용자 데이터의 형식은 소켓이 속한 주소 패밀리와 관련이 있습니다.

조건 함수에 전달된 dwCallbackData 매개 변수 값은 원래 LPWSPAccept 호출에서 dwCallbackData 매개 변수로 전달된 값입니다. 이 값은 Windows Sockets 2 클라이언트에서만 해석됩니다. 이렇게 하면 클라이언트가 LPWSPAccept 호출 사이트에서 조건 함수로 일부 컨텍스트 정보를 전달할 수 있습니다. 이 함수는 연결 수락 여부를 결정하는 데 필요한 추가 정보를 조건 함수에 제공합니다. 일반적인 사용법은 이 소켓이 연결된 애플리케이션 정의 개체에 대한 참조를 포함하는 데이터 구조에 (적절하게 캐스팅) 포인터를 전달하는 것입니다.

요구 사항

   
지원되는 최소 클라이언트 Windows 2000 Professional[데스크톱 앱만]
지원되는 최소 서버 Windows 2000 Server[데스크톱 앱만]
대상 플랫폼 Windows
헤더 ws2spi.h

참고 항목

LPWSPAsyncSelect

LPWSPBind

LPWSPConnect

LPWSPEventSelect

LPWSPGetSockOpt

LPWSPListen

LPWSPSelect

LPWSPSocket