LPFN_RIOCREATEREQUESTQUEUE回呼函式 (mswsock.h)

RIOCreateRequestQueue 函式會使用指定的套接字和 I/O 完成佇列建立已註冊的 I/O 套接字描述符,以搭配 Winsock 已註冊的 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 函式來擷取特定的錯誤碼。

傳回碼 Description
WSAEINVAL
無效的參數已傳遞至 函式。
如果 ReceiveCQSendCQ 參數包含 RIO_INVALID_CQ,就會傳回此錯誤。 如果 MaxOutstandingReceiveMaxOutstandingSend 參數都為零,就會傳回此錯誤。 如果在 Socket 參數中傳遞的套接字是在初始化或關閉的過程中,也會傳回此錯誤。
WSAENOBUFS
無法配置足夠的記憶體。 如果記憶體不足,無法根據參數配置要求佇列,就會傳回此錯誤。 如果超過網路會話限制,也會傳回此錯誤。
WSAENOTSOCK
描述項不是套接字。 如果 Socket 參數不是有效的套接字,就會傳回此錯誤。
WSAEOPNOTSUPP
參考的物件類型不支援嘗試的作業。 套接字 參數中 不支援的套接字類型 (SOCK_RAW 傳回 此錯誤,例如)

備註

RIOCreateRequestQueue 函式會使用指定的套接字和 I/O 完成佇列建立已註冊的 I/O 套接字描述元。 應用程式必須先呼叫RIOCreateRequestQueue,才能取得 Winsock 套接字的RIO_RQ,應用程式才能使用RIOSendRIOSendExRIOReceive 或RIOReceiveEx 函式。 若要取得RIO_RQ,Winsock 套接字必須與傳送和接收的完成佇列相關聯,雖然這兩者都可以使用相同的完成佇列。

由於完成佇列的大小有限,套接字只能與傳送和接收作業的完成佇列相關聯,如果它保證不會超過佇列完成總數的容量。 因此,呼叫 RIOCreateRequestQueue 函式會建立套接字特定限制。 這些限制會在 RIOCreateRequestQueue 呼叫期間使用,以驗證完成佇列中足夠的空間,以容納套接字要求,並在要求起始期間確保要求不會造成套接字超過其限制。

傳送和接收佇列可以與多個套接字相關聯。 傳送和接收佇列的大小必須大於或等於所有附加套接字的傳送和接收大小。 當使用 closesocket 函式關閉套接字來關閉要求佇列時,這些位置將會釋出以供其他套接字使用。

注意

為了有效率,存取完成佇列 (RIO_CQ 結構) ,並要求佇列 (RIO_RQ 結構) 不受同步處理基本類型保護。 如果您需要從多個線程存取完成或要求佇列,應該以重要區段、精簡讀取器寫入鎖定或類似的機制協調存取。 單一線程存取時不需要此鎖定。 不同的線程可以存取個別的要求/完成佇列,而不需要鎖定。 只有在多個線程嘗試存取相同的佇列時,才會發生同步處理的需求。 如果多個線程在相同的套接字上傳送和接收,因為傳送和接收作業使用套接字的要求佇列,則也需要同步處理。

 

當應用程式使用 RIO_RQ完成時,應用程式應該呼叫 closesocket 函式來關閉套接字並釋放相關聯的資源。

注意

若要在運行時間取得RIOCreateRequestQueue 函式的函式指標,您必須透過指定SIO_GET_MULTIPLE_EXTENSION_FUNCTION_POINTER opcode 呼叫 WSAIoctl 函式。 傳遞至 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 8 和更新版本 Windows Phone 市集應用程式支援此函式。

Windows 8.1Windows Server 2012 R2:Windows 8.1、Windows Server 2012 R2 及更新版本上的 Windows 市集應用程式支援此函式。

規格需求

需求
標頭 mswsock.h