LPFN_RIOCREATEREQUESTQUEUE 콜백 함수(mswsock.h)
RIOCreateRequestQueue 함수는 Winsock 등록 I/O 확장에 사용할 지정된 소켓 및 I/O 완료 큐를 사용하여 등록된 I/O 소켓 설명자를 만듭니다.
구문
LPFN_RIOCREATEREQUESTQUEUE LpfnRiocreaterequestqueue;
RIO_RQ LpfnRiocreaterequestqueue(
SOCKET Socket,
ULONG MaxOutstandingReceive,
ULONG MaxReceiveDataBuffers,
ULONG MaxOutstandingSend,
ULONG MaxSendDataBuffers,
RIO_CQ ReceiveCQ,
RIO_CQ SendCQ,
PVOID SocketContext
)
{...}
매개 변수
Socket
소켓을 식별하는 설명자입니다.
MaxOutstandingReceive
소켓에서 허용되는 미해결 수신의 최대 수입니다.
이 매개 변수는 일반적으로 대부분의 애플리케이션에 대해 작은 수입니다.
MaxReceiveDataBuffers
소켓의 최대 수신 데이터 버퍼 수입니다.
참고
Windows 8 및 Windows Server 2012 의 경우 이 매개 변수는 1이어야 합니다.
MaxOutstandingSend
소켓에서 허용되는 최대 미해결 송신 수입니다.
MaxSendDataBuffers
소켓의 최대 송신 데이터 버퍼 수입니다.
참고
Windows 8 및 Windows Server 2012 의 경우 이 매개 변수는 1이어야 합니다.
ReceiveCQ
수신 요청 완료에 사용할 I/O 완료 큐를 식별하는 설명자입니다.
SendCQ
보내기 요청 완료에 사용할 I/O 완료 큐를 식별하는 설명자입니다.
이 매개 변수의 값은 ReceiveCQ 매개 변수와 같을 수 있습니다.
SocketContext
이 요청 큐와 연결할 소켓 컨텍스트입니다.
반환 값
오류가 발생하지 않으면 RIOCreateRequestQueue 함수는 새 요청 큐를 참조하는 설명자를 반환합니다. 그렇지 않으면 RIO_INVALID_RQ 값이 반환되고 WSAGetLastError 함수를 호출하여 특정 오류 코드를 검색할 수 있습니다.
반환 코드 | 설명 |
---|---|
잘못된 매개 변수가 함수에 전달되었습니다. ReceiveCQ 또는 SendCQ 매개 변수에 RIO_INVALID_CQ 포함된 경우 이 오류가 반환됩니다. MaxOutstandingReceive 및 MaxOutstandingSend 매개 변수가 모두 0이면 이 오류가 반환됩니다. 이 오류는 Socket 매개 변수에 전달된 소켓이 초기화 또는 닫는 프로세스에 있는 경우에도 반환됩니다. |
|
충분한 메모리를 할당할 수 없습니다. 이 오류는 매개 변수를 기반으로 요청 큐를 할당할 메모리가 부족한 경우 반환됩니다. 이 오류는 네트워크 세션 제한을 초과한 경우에도 반환됩니다. |
|
설명자가 소켓이 아닙니다. 이 오류는 Socket 매개 변수가 유효한 소 켓 이 아닌 경우 반환됩니다. |
|
시도한 작업은 참조된 개체 형식에 대해 지원되지 않습니다. 이 오류는 지원되지 않는 소켓 유형에 대한 Socket 매개 변수의 소켓에 대해 반환됩니다(예: SOCK_RAW). |
설명
RIOCreateRequestQueue 함수는 지정된 소켓 및 I/O 완료 큐를 사용하여 등록된 I/O 소켓 설명자를 만듭니다. 애플리케이션이 RIOSend, RIOSendEx, RIOReceive 또는 RIOReceiveEx 함수를 사용하려면 먼저 애플리케이션이 RIOCreateRequestQueue를 호출하여 Winsock 소켓에 대한 RIO_RQ 가져와야 합니다. RIO_RQ 가져오려면 Winsock 소켓을 송신 및 수신에 대한 완료 큐와 연결해야 하지만 두 큐 모두에 동일한 완료 큐를 사용할 수 있습니다.
완료 큐의 한정된 크기로 인해 소켓은 전체 큐 완료 용량을 초과하지 않도록 보장하는 경우에만 송신 및 수신 작업에 대한 완료 큐와 연결될 수 있습니다. 따라서 소켓 특정 제한은 RIOCreateRequestQueue 함수 호출에 의해 설정됩니다. 이러한 제한은 RIOCreateRequestQueue 호출 중에 소켓 요청을 수용하기 위한 완료 큐의 충분한 공간을 확인하고 요청 시작 시간 동안 요청으로 인해 소켓이 제한을 초과하지 않도록 하는 데 사용됩니다.
송신 및 수신 큐는 여러 소켓과 연결할 수 있습니다. 송신 및 수신 큐의 크기는 연결된 모든 소켓의 송신 및 수신 크기보다 크거나 같아야 합니다. closesocket 함수를 사용하여 소켓을 닫아 요청 큐를 닫으면 다른 소켓에서 사용할 수 있는 슬롯이 해제됩니다.
참고
효율성을 위해 완료 큐(RIO_CQ 구조체) 및 요청 큐(RIO_RQ 구조체)에 대한 액세스는 동기화 기본 형식으로 보호되지 않습니다. 여러 스레드에서 완료 또는 요청 큐에 액세스해야 하는 경우 중요한 섹션, 슬림 판독기 쓰기 잠금 또는 유사한 메커니즘을 통해 액세스를 조정해야 합니다. 이 잠금은 단일 스레드의 액세스에 필요하지 않습니다. 다른 스레드는 잠금 없이 별도의 요청/완료 큐에 액세스할 수 있습니다. 동기화의 필요성은 여러 스레드가 동일한 큐에 액세스하려고 할 때만 발생합니다. 송신 및 수신 작업이 소켓의 요청 큐를 사용하기 때문에 여러 스레드 문제가 동일한 소켓에서 보내고 받는 경우에도 동기화가 필요합니다.
RIO_RQ 사용이 완료되면 애플리케이션은 closesocket 함수를 호출하여 소켓을 닫고 연결된 리소스를 해제해야 합니다.
참고
지정된 SIO_GET_MULTIPLE_EXTENSION_FUNCTION_POINTER opcode를 사용하여 WSAIoctl 함수를 호출하여 런타임에 RIOCreateRequestQueue 함수에 대한 함수 포인터를 가져와야 합니다. 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 |