LPFN_RIONOTIFY 콜백 함수(mswsock.h)
RIONotify 함수는 Winsock 등록 I/O 확장에 사용할 I/O 완료 큐에 알림 동작에 사용할 메서드를 등록합니다.
구문
LPFN_RIONOTIFY LpfnRionotify;
INT LpfnRionotify(
RIO_CQ CQ
)
{...}
매개 변수
CQ
I/O 완료 큐를 식별하는 설명자입니다.
반환 값
오류가 발생하지 않으면 RIONotify 함수는 ERROR_SUCCESS 반환합니다. 그렇지 않으면 함수가 실패하고 특정 오류 코드가 반환됩니다.
반환 코드 | 설명 |
---|---|
잘못된 매개 변수가 함수에 전달되었습니다. 이 오류는 CQ 매개 변수에 잘못된 완료 큐가 전달되면 반환됩니다(예: RIO_INVALID_CQ). 내부 오류가 발생할 때 이 오류를 반환할 수도 있습니다. |
|
이미 작업이 진행 중인 비동기 소켓에 작업을 시도했습니다. 이전 RIONotify 요청이 아직 완료되지 않은 경우 이 오류가 반환됩니다. |
설명
RIONotify 함수는 Winsock 등록 I/O 확장을 사용하여 네트워크 데이터를 보내거나 받기 위한 알림 동작에 사용할 메서드를 등록합니다.
RIONotify 함수는 애플리케이션이 요청이 완료된 것을 확인하고 RIODequeueCompletion 함수에 대한 호출을 기다리는 메커니즘입니다. RIONotify 함수는 I/O 완료 큐가 비어 있지 않고 결과 완료를 포함하는 경우 알림 동작에 사용할 메서드를 설정합니다.
완료 큐에 대한 알림 동작은 RIO_CQ 만들 때 설정됩니다. RIO_NOTIFICATION_COMPLETION 구조체는 RIO_CQ 만들 때 RIOCreateCompletionQueue 함수에 전달됩니다.
이벤트를 사용하는 완료 큐의 경우 RIO_NOTIFICATION_COMPLETION 구조체의 Type 멤버가 RIO_EVENT_COMPLETION 설정됩니다. Event.EventHandle 멤버는 WSACreateEvent 또는 CreateEvent 함수에서 만든 이벤트에 대한 핸들을 포함해야 합니다. RIONotify 완료를 받으려면 애플리케이션이 WSAWaitForMultipleEvents 또는 유사한 대기 루틴을 사용하여 지정된 이벤트 핸들을 대기해야 합니다. 애플리케이션이 이벤트를 다시 설정하고 다시 사용하려는 경우 Event.NotifyReset 멤버를 0이 아닌 값으로 설정하여 오버헤드를 줄일 수 있습니다. 이렇게 하면 알림이 발생할 때 RIONotify 함수에 의해 이벤트가 자동으로 다시 설정됩니다. 이렇게 하면 WSAResetEvent 함수를 호출하여 RIONotify 함수 호출 간에 이벤트를 다시 설정할 필요가 없습니다.
RIONotify 함수를 사용된 이벤트 완료라고 하고 지정된 완료 큐가 아직 비어 있지 않으면 이벤트가 동기적으로 또는 비동기적으로 설정됩니다. 두 경우 모두 이벤트가 설정되기 전에 추가 항목이 완료 큐에 들어갈 필요가 없습니다. 완료 큐에 RIO_MSG_DONT_NOTIFY 플래그가 설정되지 않은 요청의 완료가 포함될 때까지 완료 큐는 RIONotify 함수의 용도로 비어 있는 것으로 간주되며 이벤트가 설정되지 않습니다. 완료된 모든 요청은 RIODequeueCompletion 함수를 사용하여 계속 검색할 수 있습니다. 이벤트가 설정되면 애플리케이션은 일반적으로 RIODequeueCompletion 함수를 호출하여 완료된 송신 및 수신 요청을 큐에서 제거합니다.
I/O 완료 포트를 사용하는 완료 큐의 경우 RIO_NOTIFICATION_COMPLETION 구조체의 Type 멤버가 RIO_IOCP_COMPLETION 설정됩니다. Iocp.IocpHandle 멤버는 CreateIoCompletionPort 함수에서 만든 I/O 완료 포트에 대한 핸들을 포함해야 합니다. RIONotify 완료를 받으려면 애플리케이션에서 GetQueuedCompletionStatus 또는 GetQueuedCompletionStatusEx 함수를 호출해야 합니다. 애플리케이션은 완료 큐에 대한 전용 OVERLAPPED 개체를 제공해야 하며, Iocp.CompletionKey 멤버를 사용하여 완료 큐의 RIONotify 요청을 다른 완료 큐에 대한 RIONotify 완료를 비롯한 다른 I/O 완료와 구분할 수도 있습니다.
스레드 풀을 사용하는 애플리케이션은 스레드 풀 대기 개체를 사용하여 스레드 풀을 통해 RIONotify 완료를 가져올 수 있습니다. 이 경우 SetThreadpoolWait 함수에 대한 호출은 RIONotify 호출 바로 뒤에 와야 합니다. RIONotify 전에 SetThreadpoolWait 함수가 호출되고 애플리케이션이 RIONotify를 사용하여 이벤트 개체를 지우는 경우 대기 개체 콜백이 가짜로 실행될 수 있습니다.
참고
RIONotify 함수에 대한 함수 포인터는 지정된 SIO_GET_MULTIPLE_EXTENSION_FUNCTION_POINTER opcode를 사용하여 WSAIoctl 함수를 호출하여 런타임에 가져와야 합니다. 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 스토어 앱에서 지원됩니다.
스레드 보안
여러 스레드가 RIODequeueCompletion 함수를 사용하여 동일한 RIO_CQ 액세스하려는 경우 중요한 섹션, 슬림 판독기 기록기 잠금 또는 유사한 상호 제외 메커니즘을 통해 액세스를 조정해야 합니다. 완료 큐가 공유되지 않는 경우 상호 제외가 필요하지 않습니다.
요구 사항
요구 사항 | 값 |
---|---|
헤더 | mswsock.h |