다음을 통해 공유


LPFN_RIORECEIVEEX 콜백 함수(mswsock.h)

RIOReceiveEx 함수는 연결된 등록된 I/O TCP 소켓 또는 바인딩된 등록된 I/O UDP 소켓에서 Winsock 등록 I/O 확장에 사용할 추가 옵션을 사용하여 네트워크 데이터를 받습니다.

구문

LPFN_RIORECEIVEEX LpfnRioreceiveex;

int LpfnRioreceiveex(
                                                                                                                     RIO_RQ SocketQueue,
                                                                                                                     PRIO_BUF pData,
                                                                                                                     ULONG DataBufferCount,
                                                                                                                     PRIO_BUF pLocalAddress,
                                                                                                                     PRIO_BUF pRemoteAddress,
                                                                                                                     PRIO_BUF pControlContext,
                                                                                                                     PRIO_BUF pFlags,
                                                                                                                     DWORD Flags,
                                                                                                                     PVOID RequestContext
)
{...}

매개 변수

SocketQueue

연결된 등록된 I/O UDP 소켓 또는 바인딩된 등록된 I/O UDP 소켓을 식별하는 설명자입니다.

pData

데이터를 받을 등록된 버퍼 부분에 대한 설명입니다.

애플리케이션이 UDP 데이터그램에서 데이터 페이로드를 받을 필요가 없는 경우 이 매개 변수는 바인딩된 등록된 I/O UDP 소켓에 대해 NULL일 수 있습니다.

DataBufferCount

pData 매개 변수가 가리키는 버퍼에서 데이터를 받을 것인지를 나타내는 데이터 버퍼 수 매개 변수입니다.

pData가 NULL인 경우 이 매개 변수를 0으로 설정해야 합니다. 그렇지 않으면 이 매개 변수를 1로 설정해야 합니다.

pLocalAddress

완료 시 네트워크 데이터가 수신된 로컬 주소를 보유하는 버퍼 세그먼트입니다.

애플리케이션이 로컬 주소를 수신하지 않으려는 경우 이 매개 변수는 NULL 일 수 있습니다. 이 매개 변수가 NULL이 아닌 경우 버퍼 세그먼트는 SOCKADDR_INET 구조체의 크기 이상이어야 합니다.

pRemoteAddress

완료 시 네트워크 데이터가 수신된 원격 주소를 보유하는 버퍼 세그먼트입니다.

애플리케이션이 원격 주소를 수신하지 않으려는 경우 이 매개 변수는 NULL 일 수 있습니다. 이 매개 변수가 NULL이 아닌 경우 버퍼 세그먼트는 SOCKADDR_INET 구조체의 크기 이상이어야 합니다.

pControlContext

완료 시 수신 작업에 대한 추가 제어 정보를 포함하는 버퍼 조각입니다.

애플리케이션이 추가 제어 정보를 수신하지 않으려는 경우 이 매개 변수는 NULL 일 수 있습니다.

pFlags

Flags

RIOReceiveEx 함수의 동작을 수정하는 플래그 집합입니다.

Flags 매개 변수는 헤더 파일에 정의된 다음 옵션의 조합을 포함할 Mswsockdef.h 수 있습니다.

RIO_MSG_COMMIT_ONLY

RIO_MSG_DEFER 플래그와 함께 추가된 이전 요청이 커밋됩니다.

RIO_MSG_COMMIT_ONLY 플래그를 설정하면 다른 플래그를 지정할 수 없습니다. RIO_MSG_COMMIT_ONLY 플래그가 설정되면 pData, pLocalAddress, pRemoteAddress, pControlContext, pFlagsRequestContext 인수는 NULL이어야 하며 DataBufferCount 인수는 0이어야 합니다.

이 플래그는 일반적으로 RIO_MSG_DEFER 플래그 집합과 함께 여러 요청을 실행한 후에 가끔 사용됩니다. 이렇게 하면 RIO_MSG_DEFER 플래그를 사용하여 RIO_MSG_DEFER 플래그 없이 마지막 요청을 수행할 필요가 없으므로 마지막 요청이 다른 요청보다 훨씬 느리게 완료됩니다.

RIOReceiveEx 함수에 대한 다른 호출과 달리, RIO_MSG_COMMIT_ONLY 플래그가 설정된 경우 RIOReceiveEx 함수에 대한 호출을 serialize할 필요가 없습니다. 단일 RIO_RQ 경우 다른 스레드에서 RIOReceiveEx 함수를 호출하는 동안 한 스레드에서 RIO_MSG_COMMIT_ONLY사용하여 RIOReceiveEx 함수를 호출할 수 있습니다.

RIO_MSG_DONT_NOTIFY

요청 완료가 완료 큐에 삽입될 때 요청이 RIONotify 함수를 트리거해서는 안 됩니다.

RIO_MSG_DEFER

요청을 즉시 실행할 필요는 없습니다. 그러면 요청 큐에 요청이 삽입되지만 요청 실행을 트리거하거나 트리거하지 않을 수 있습니다.

RIO_MSG_DEFER 플래그 집합 없이 SocketQueue 매개 변수에 전달된 RIO_RQ 수신 요청이 이루어질 때까지 데이터 수신이 지연될 수 있습니다. 요청 큐의 모든 수신에 대한 실행을 트리거하려면 RIO_MSG_DEFER 플래그 집합 없이 RIOReceive 또는 RIOReceiveEx 함수를 호출합니다.

참고

수신 요청은 RIO_MSG_DEFER 설정되었는지 여부에 관계없이 SocketQueue 매개 변수에 전달된RIO_RQ 미해결 I/O 용량에 대해 청구됩니다.

RIO_MSG_WAITALL

RIOReceiveEx 함수는 다음 이벤트 중 하나가 발생할 때까지 완료되지 않습니다.

  • pData 매개 변수에서 호출자가 제공한 버퍼 조각이 완전히 가득 찼습니다.
  • 연결이 닫혔습니다.
  • 요청이 취소되었거나 오류가 발생했습니다.

이 플래그는 데이터그램 소켓 또는 메시지 지향 연결 없는 소켓에서 지원되지 않습니다.

RequestContext

이 수신 작업과 연결할 요청 컨텍스트입니다.

반환 값

오류가 발생하지 않으면 RIOReceiveEx 함수는 TRUE를 반환합니다. 이 경우 수신 작업이 성공적으로 시작되고 완료가 이미 큐에 대기되었거나 작업이 성공적으로 시작되었으며 나중에 완료가 큐에 대기됩니다.

FALSE 값은 함수가 실패하고 작업이 성공적으로 시작되지 않았으며 완료 표시가 큐에 대기되지 않음을 나타냅니다. WSAGetLastError 함수를 호출하여 특정 오류 코드를 검색할 수 있습니다.

반환 코드 설명
WSAEFAULT 시스템이 호출에서 포인터 인수를 사용하려는 시도에서 잘못된 포인터 주소를 발견했습니다. 이 오류는 버퍼 식별자가 등록 취소되거나 작업이 큐에 대기되거나 호출되기 전에 매개 변수에 전달된 RIO_BUF 구조체에 대해 버퍼가 해제된 경우 반환됩니다.
WSAEINVAL 잘못된 매개 변수가 함수에 전달되었습니다.
SocketQueue 매개 변수가 유효하지 않거나, dwFlags 매개 변수에 수신 작업에 유효하지 않은 값이 포함되어 있거나, 완료 큐의 무결성이 손상된 경우 이 오류가 반환됩니다. 매개 변수와 관련된 다른 문제에 대해서도 이 오류를 반환할 수 있습니다.
WSAENOBUFS 충분한 메모리를 할당할 수 없습니다. SocketQueue 매개 변수와 연결된 I/O 완료 큐가 가득 차거나 수신 항목이 0개인 I/O 완료 큐를 만든 경우 이 오류가 반환됩니다.
WSA_OPERATION_ABORTED 수신 작업이 보류 중인 동안 작업이 취소되었습니다. 소켓이 로컬 또는 원격으로 닫히거나 WSAIoctl 의 SIO_FLUSH 명령이 실행되는 경우 이 오류가 반환됩니다.

설명

애플리케이션은 RIOReceiveEx 함수를 사용하여 등록된 단일 버퍼 내에 완전히 포함된 모든 버퍼로 네트워크 데이터를 수신할 수 있습니다. pData 매개 변수가 가리키는 RIO_BUF 구조체의 OffsetLength 멤버는 버퍼에서 네트워크 데이터가 수신되는 위치를 결정합니다.

RIOReceiveEx 함수가 호출되면 RIO_BUF 구조체의 BufferId 멤버에 있는 RIO_BUFFERID 포함하여 pData 매개 변수에 전달된 버퍼는 수신 작업 기간 동안 유효한 상태를 유지해야 합니다.

경합 조건을 방지하기 위해 요청이 완료되기 전에 수신 요청과 연결된 버퍼를 읽거나 작성해서는 안 됩니다. 여기에는 버퍼를 송신 요청의 원본으로 사용하거나 다른 수신 요청의 대상을 사용하는 것이 포함됩니다. 수신 요청과 연결되지 않은 등록된 버퍼의 일부는 이 제한에 포함되지 않습니다.

pLocalAddress 매개 변수를 사용하여 데이터를 받은 로컬 주소를 검색할 수 있습니다. pRemoteAddress 매개 변수를 사용하여 데이터를 받은 원격 주소를 검색할 수 있습니다. 로컬 및 원격 주소는 SOCKADDR_INET 구조체로 반환됩니다. 따라서 pLocalAddress 또는 pRemoteAddress 매개 변수가 가리키는 RIO_BUFLength 멤버는 SOCKADDR_INET 구조체의 크기보다 크거나 같아야 합니다.

다음 표에는 pControlContext 멤버의 컨트롤 정보와 함께 사용할 수 있는 컨트롤 데이터의 다양한 용도가 요약되어 있습니다.

프로토콜 cmsg_level cmsg_type Description
IPv4 IPPROTO_IP IP_ORIGINAL_ARRIVAL_IF 데이터그램 소켓에 대해 패킷이 수신된 원래 IPv4 도착 인터페이스를 수신합니다. 이 제어 데이터는 Teredo, 6to4 또는 ISATAP 터널이 IPv4 NAT 통과에 사용되는 경우 방화벽에서 사용됩니다.
cmsg_data[] 멤버는 ifdef.h 헤더 파일에 정의된 IF_INDEX 포함하는 ULONG입니다.
자세한 내용은 IP_ORIGINAL_ARRIVAL_IF 소켓 옵션에 대한 IPPROTO_IP 소 켓 옵션을 참조하세요.
IPv4 IPPROTO_IP IP_PKTINFO 패킷 정보를 지정/받습니다.
자세한 내용은 IP_PKTINFO 소켓 옵션 에 대한 IPPROTO_IP 소켓 옵션을 참조하세요.
IPv6 IPPROTO_IPV6 IPV6_DSTOPTS 대상 옵션을 지정/받습니다.
IPv6 IPPROTO_IPV6 IPV6_HOPLIMIT 홉 제한을 지정/받습니다.
자세한 내용은 IPV6_HOPLIMIT 소켓 옵션 에 대한 IPPROTO_IPV6 소켓 옵션을 참조하세요.
IPv6 IPPROTO_IPV6 IPV6_HOPOPTS 홉별 옵션을 지정/받습니다.
IPv6 IPPROTO_IPV6 IPV6_NEXTHOP 다음 홉 주소를 지정합니다.
IPv6 IPPROTO_IPV6 IPV6_PKTINFO 패킷 정보를 지정/받습니다.
자세한 내용은 IPV6_PKTINFO 소켓 옵션 에 대한 IPPROTO_IPV6 소켓 옵션을 참조하세요.
IPv6 IPPROTO_IPV6 IPV6_RTHDR 라우팅 헤더를 지정/받습니다.

컨트롤 데이터는 각각 WSACMSGHDR 구조로 시작하여 다음과 같이 정의된 하나 이상의 제어 데이터 개체로 구성됩니다.

} WSACMSGHDR;

WSACMSGHDR 구조체의 멤버는 다음과 같습니다.

용어 Description
cmsg_len WSACMSGHDR의 시작부터 데이터 끝까지의 데이터 바이트 수입니다(데이터를 따를 수 있는 패딩 바이트 제외).
cmsg_level 제어 정보를 시작한 프로토콜입니다.
cmsg_type 프로토콜별 제어 정보 유형입니다.

Flags 매개 변수를 사용하여 연결된 소켓에 대해 지정된 옵션 외에 RIOReceiveEx 함수 호출의 동작에 영향을 줄 수 있습니다. 이 함수의 동작은 SocketQueue 매개 변수와 연결된 소켓에 설정된 소켓 옵션과 Flags 매개 변수에 지정된 값의 조합에 따라 결정됩니다.

참고

지정된 SIO_GET_MULTIPLE_EXTENSION_FUNCTION_POINTER opcode를 사용하여 WSAIoctl 함수를 호출하여 런타임에 RIOReceiveEx 함수에 대한 함수 포인터를 가져와야 합니다. WSAIoctl 함수에 전달된 입력 버퍼에는 값이 Winsock 등록 I/O 확장 함수를 식별하는 GUID(Globally Unique Identifier)인 WSAID_MULTIPLE_RIO 포함되어야 합니다. 성공하면 WSAIoctl 함수에서 반환된 출력에는 Winsock 등록 I/O 확장 함수에 대한 포인터가 포함된 RIO_EXTENSION_FUNCTION_TABLE 구조체에 대한 포인터가 포함됩니다. SIO_GET_MULTIPLE_EXTENSION_FUNCTION_POINTER IOCTL은 Ws2def.h 헤더 파일에 정의되어 있습니다. WSAID_MULTIPLE_RIO GUID는 Mswsock.h 헤더 파일에 정의되어 있습니다.

Windows Phone 8: 이 함수는 Windows Phone 8 이상에서 Windows Phone 스토어 앱에서 지원됩니다.

Windows 8.1Windows Server 2012 R2: 이 함수는 Windows 8.1, Windows Server 2012 R2 이상에서 Windows 스토어 앱에서 지원됩니다.

요구 사항

요구 사항
헤더 mswsock.h