LPFN_RIONOTIFY回呼函式 (mswsock.h)
RIONotify 函式會向 I/O 完成佇列註冊通知行為註冊方法註冊方法,以便與 Winsock 已註冊的 I/O 延伸模組搭配使用。
語法
LPFN_RIONOTIFY LpfnRionotify;
INT LpfnRionotify(
RIO_CQ CQ
)
{...}
參數
CQ
識別 I/O 完成佇列的描述項。
傳回值
如果沒有發生錯誤, 則RIONotify 函式 會 傳回ERROR_SUCCESS。 否則,函式會失敗,並傳回特定的錯誤碼。
傳回碼 | Description |
---|---|
無效的參數已傳遞至 函式。 如果在 CQ 參數中傳遞無效的完成佇列, (RIO_INVALID_CQ,例如 ) ,就會傳回此錯誤。 當發生內部錯誤時,也可以傳回此錯誤。 |
|
嘗試在操作中的非封鎖通訊端上執行操作。 如果先前的 RIONotify 要求尚未完成,就會傳回此錯誤。 |
備註
RIONotify 函式會註冊方法,以便用來傳送或接收具有 Winsock 已註冊 I/O 延伸模組的網路數據通知行為。
RIONotify 函式是一種機制,應用程式會找出要求已完成,並等候對RIODequeueCompletion 函式的呼叫。 當 I/O 完成佇列不是空的且包含結果完成時, RIONotify 函式會設定要用於通知行為的方法。
建立 RIO_CQ 時,會設定完成佇列的通知行為。 建立RIO_CQ時,RIO_NOTIFICATION_COMPLETION結構會傳遞至RIOCreateCompletionQueue 函式。
對於使用事件的完成佇列,RIO_NOTIFICATION_COMPLETION 結構的 Type 成員會設定為RIO_EVENT_COMPLETION。 Event.EventHandle 成員應該包含 WSACreateEvent 或 CreateEvent 函式所建立事件的句柄。 若要接收 RIONotify 完成,應用程式應該使用 WSAWaitForMultipleEvents 或類似的等候例程等候指定的事件句柄。 如果應用程式計劃重設並重複使用事件,應用程式可以將 Event.NotifyReset 成員設定為非零值,以減少額外負荷。 當通知發生時,這會導致 一旦發生此事件,就會由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 要求與其他 I/O 完成,包括其他完成佇列的 RIONotify 完成。
使用線程集區的應用程式可以使用線程集區等候物件,透過其線程集區取得 RIONotify 完成。 在此情況下, 對SetThreadpoolWait 函式的呼叫應該緊接在對 RIONotify的呼叫之後。 如果在RIONotify 之前呼叫 SetThreadpoolWait 函式,而且應用程式依賴RIONotify 來清除事件物件,這可能會導致等候物件回呼的假性執行。
注意
在運行時間必須呼叫 WSAIoctl 函式並指定 SIO_GET_MULTIPLE_EXTENSION_FUNCTION_POINTER opcode,以取得RIONotify 函式的函式指標。 傳遞至 WSAIoctl 函式的輸入緩衝區必須包含 WSAID_MULTIPLE_RIO,這是全域唯一標識碼 (GUID) ,其值可識別 Winsock 已註冊的 I/O 延伸模組函式。 成功時, WSAIoctl 函式所傳回的輸出會包含 指向RIO_EXTENSION_FUNCTION_TABLE 結構的指標,其中包含 Winsock 已註冊 I/O 延伸模組函式的指標。 SIO_GET_MULTIPLE_EXTENSION_FUNCTION_POINTER IOCTL 定義於 Ws2def.h 頭檔中。 WSAID_MULTIPLE_RIO GUID 定義於 Mswsock.h 頭檔中。
Windows Phone 8:Windows Phone Windows Phone 8 和更新版本上的市集應用程式支援此函式。
Windows 8.1 和 Windows Server 2012 R2:Windows 8.1、Windows Server 2012 R2 及更新版本上的 Windows 市集應用程式支援此函式。
執行緒安全性
如果多個線程嘗試使用RIODequeueCompletion 函式來存取相同的RIO_CQ,則必須由重要區段、讀取器寫入器鎖定或類似的互斥機制協調存取。 如果未共用完成佇列,則不需要互斥。
規格需求
需求 | 值 |
---|---|
標頭 | mswsock.h |