LPFN_RIORECEIVE 콜백 함수(mswsock.h)
RIOReceive 함수는 Winsock 등록 I/O 확장에 사용하기 위해 연결된 등록된 I/O TCP 소켓 또는 바인딩된 등록된 I/O UDP 소켓에서 네트워크 데이터를 받습니다.
구문
LPFN_RIORECEIVE LpfnRioreceive;
BOOL LpfnRioreceive(
RIO_RQ SocketQueue,
PRIO_BUF pData,
ULONG DataBufferCount,
DWORD Flags,
PVOID RequestContext
)
{...}
매개 변수
SocketQueue
연결된 등록된 I/O TCP 소켓 또는 바인딩된 등록된 I/O UDP 소켓을 식별하는 설명자입니다.
pData
데이터를 받을 등록된 버퍼 부분에 대한 설명입니다.
애플리케이션이 UDP 데이터그램에서 데이터 페이로드를 수신할 필요가 없는 경우 이 매개 변수는 바인딩된 등록된 I/O UDP 소켓에 대해 NULL일 수 있습니다.
DataBufferCount
pData 매개 변수가 가리키는 버퍼에서 데이터를 받을 것인지를 나타내는 데이터 버퍼 수 매개 변수입니다.
pData가 NULL인 경우 이 매개 변수를 0으로 설정해야 합니다. 그렇지 않으면 이 매개 변수를 1로 설정해야 합니다.
Flags
RIOReceive 함수의 동작을 수정하는 플래그 집합입니다.
Flags 매개 변수는 헤더 파일에 정의된 다음 옵션의 조합을 포함할 Mswsockdef.h
수 있습니다.
RIO_MSG_COMMIT_ONLY
RIO_MSG_DEFER 플래그와 함께 추가된 이전 요청이 커밋됩니다.
RIO_MSG_COMMIT_ONLY 플래그를 설정하면 다른 플래그를 지정할 수 없습니다. RIO_MSG_COMMIT_ONLY 플래그가 설정되면 pData 및 RequestContext 인수는 NULL이어야 하며 DataBufferCount 인수는 0이어야 합니다.
이 플래그는 일반적으로 RIO_MSG_DEFER 플래그 집합과 함께 여러 요청을 실행한 후에 가끔 사용됩니다. 이렇게 하면 RIO_MSG_DEFER 플래그를 사용하여 RIO_MSG_DEFER 플래그 없이 마지막 요청을 수행할 필요가 없으므로 마지막 요청이 다른 요청보다 훨씬 느리게 완료됩니다.
RIOReceive 함수에 대한 다른 호출과 달리, RIO_MSG_COMMIT_ONLY 플래그가 설정된 경우 RIOReceive 함수에 대한 호출을 serialize할 필요가 없습니다. 단일 RIO_RQ 경우 다른 스레드에서 RIOReceive 함수를 호출하는 동안 한 스레드에서 RIO_MSG_COMMIT_ONLY사용하여 RIOReceive 함수를 호출할 수 있습니다.
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
RIOReceive 함수는 다음 이벤트 중 하나가 발생할 때까지 완료되지 않습니다.
- pData 매개 변수에서 호출자가 제공한 버퍼 세그먼트가 완전히 가득 찼습니다.
- 연결이 닫혔습니다.
- 요청이 취소되었거나 오류가 발생했습니다.
이 플래그는 UDP 소켓에서 지원되지 않습니다.
RequestContext
이 수신 작업과 연결할 요청 컨텍스트입니다.
반환 값
오류가 발생하지 않으면 RIOReceive 함수는TRUE를 반환합니다. 이 경우 수신 작업이 성공적으로 시작되고 완료가 이미 큐에 대기되었거나 작업이 성공적으로 시작되었으며 나중에 완료가 큐에 대기됩니다.
FALSE 값은 함수가 실패하고 작업이 성공적으로 시작되지 않았으며 완료 표시가 큐에 대기되지 않음을 나타냅니다. WSAGetLastError 함수를 호출하여 특정 오류 코드를 검색할 수 있습니다.
반환 코드 | 설명 |
---|---|
WSAEFAULT | 시스템이 호출에서 포인터 인수를 사용하려는 시도에서 잘못된 포인터 주소를 발견했습니다. 이 오류는 버퍼 식별자가 등록 취소되거나 작업이 큐에 대기되거나 호출되기 전에 매개 변수에 전달된 RIO_BUF 구조체에 대해 버퍼가 해제된 경우 반환됩니다. |
WSAEINVAL | 잘못된 매개 변수가 함수에 전달되었습니다. SocketQueue 매개 변수가 유효하지 않거나 Flags 매개 변수에 수신 작업에 유효하지 않은 값이 포함되어 있거나 완료 큐의 무결성이 손상된 경우 이 오류가 반환됩니다. 매개 변수와 관련된 다른 문제에 대해서도 이 오류를 반환할 수 있습니다. |
WSAENOBUFS | 충분한 메모리를 할당할 수 없습니다. SocketQueue 매개 변수와 연결된 I/O 완료 큐가 가득 차거나 수신 항목이 0개인 I/O 완료 큐를 만든 경우 이 오류가 반환됩니다. |
WSA_OPERATION_ABORTED | 수신 작업이 보류 중인 동안 작업이 취소되었습니다. 소켓이 로컬 또는 원격으로 닫히거나 WSAIoctl의 SIO_FLUSH 명령이 이 소켓에서 실행되는 경우 이 오류가 반환됩니다. |
설명
애플리케이션은 RIOReceive 함수를 사용하여 등록된 단일 버퍼 내에 완전히 포함된 모든 버퍼로 네트워크 데이터를 수신할 수 있습니다. pData 매개 변수가 가리키는 RIO_BUF 구조체의 Offset 및 Length 멤버는 버퍼에서 네트워크 데이터가 수신되는 위치를 결정합니다.
RIOReceive 함수가 호출되면 RIO_BUF 구조체의 BufferId 멤버에 있는 RIO_BUFFERID 포함하여 pData 매개 변수에 전달된 버퍼는 수신 작업 기간 동안 유효한 상태를 유지해야 합니다.
경합 조건을 방지하기 위해 요청이 완료되기 전에 수신 요청과 연결된 버퍼를 읽거나 작성해서는 안 됩니다. 여기에는 버퍼를 송신 요청의 원본으로 사용하거나 다른 수신 요청의 대상을 사용하는 것이 포함됩니다. 수신 요청과 연결되지 않은 등록된 버퍼의 일부는 이 제한에 포함되지 않습니다.
Flags 매개 변수를 사용하여 연결된 소켓에 대해 지정된 옵션 외에 RIOReceive 함수 호출의 동작에 영향을 줄 수 있습니다. 이 함수의 동작은 SocketQueue 매개 변수와 연결된 소켓에 설정된 소켓 옵션과 Flags 매개 변수에 지정된 값의 조합에 따라 결정됩니다.
참고
지정된 SIO_GET_MULTIPLE_EXTENSION_FUNCTION_POINTER opcode를 사용하여 WSAIoctl 함수를 호출하여 런타임에 RIOReceive 함수에 대한 함수 포인터를 가져와야 합니다. 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.1 및 Windows Server 2012 R2: 이 함수는 Windows 8.1, Windows Server 2012 R2 이상에서 Windows 스토어 앱에서 지원됩니다.
요구 사항
요구 사항 | 값 |
---|---|
헤더 | mswsock.h |