LPFN_RIOCREATEREQUESTQUEUE Rückruffunktion (mswsock.h)
Die RIOCreateRequestQueue-Funktion erstellt einen registrierten E/A-Socketdeskriptor unter Verwendung einer angegebenen Socket- und E/A-Vervollständigungswarteschlange für die Verwendung mit den registrierten Winsock-E/A-Erweiterungen.
Syntax
LPFN_RIOCREATEREQUESTQUEUE LpfnRiocreaterequestqueue;
RIO_RQ LpfnRiocreaterequestqueue(
SOCKET Socket,
ULONG MaxOutstandingReceive,
ULONG MaxReceiveDataBuffers,
ULONG MaxOutstandingSend,
ULONG MaxSendDataBuffers,
RIO_CQ ReceiveCQ,
RIO_CQ SendCQ,
PVOID SocketContext
)
{...}
Parameter
Socket
Ein Deskriptor, der den Socket identifiziert.
MaxOutstandingReceive
Die maximale Anzahl ausstehender Empfänge, die für den Socket zulässig sind.
Dieser Parameter ist in der Regel eine kleine Zahl für die meisten Anwendungen.
MaxReceiveDataBuffers
Die maximale Anzahl von Empfangsdatenpuffern auf dem Socket.
Hinweis
Für Windows 8 und Windows Server 2012 muss dieser Parameter 1 sein.
MaxOutstandingSend
Die maximale Anzahl ausstehender Sendevorgänge, die für den Socket zulässig sind.
MaxSendDataBuffers
Die maximale Anzahl von Sendedatenpuffern auf dem Socket.
Hinweis
Für Windows 8 und Windows Server 2012 muss dieser Parameter 1 sein.
ReceiveCQ
Ein Deskriptor, der die E/A-Vervollständigungswarteschlange identifiziert, die für Die Vervollständigung von Empfangsanforderungen verwendet werden soll.
SendCQ
Ein Deskriptor, der die E/A-Vervollständigungswarteschlange identifiziert, die für Vervollständigungen von Sendeanforderungen verwendet werden soll.
Dieser Parameter kann denselben Wert wie der ReceiveCQ-Parameter aufweisen.
SocketContext
Der Socketkontext, der dieser Anforderungswarteschlange zugeordnet werden soll.
Rückgabewert
Wenn kein Fehler auftritt, gibt die RIOCreateRequestQueue-Funktion einen Deskriptor zurück, der auf eine neue Anforderungswarteschlange verweist. Andernfalls wird der Wert RIO_INVALID_RQ zurückgegeben, und ein bestimmter Fehlercode kann durch Aufrufen der WSAGetLastError-Funktion abgerufen werden.
Rückgabecode | Beschreibung |
---|---|
Es wurde ein ungültiger Parameter an die Funktion übergeben. Dieser Fehler wird zurückgegeben, wenn die Parameter ReceiveCQ oder SendCQRIO_INVALID_CQ enthalten. Dieser Fehler wird zurückgegeben, wenn die Parameter MaxOutstandingReceive und MaxOutstandingSend 0 sind. Dieser Fehler wird auch zurückgegeben, wenn der im Socket-Parameter übergebene Socket gerade initialisiert oder geschlossen wird. |
|
Es konnte nicht genügend Arbeitsspeicher zugewiesen werden. Dieser Fehler wird zurückgegeben, wenn nicht genügend Arbeitsspeicher vorhanden war, um die Anforderungswarteschlange basierend auf den Parametern zuzuordnen. Dieser Fehler wird auch zurückgegeben, wenn das Netzwerksitzungslimit überschritten wurde. |
|
Der Deskriptor ist kein Socket. Dieser Fehler wird zurückgegeben, wenn der Socket-Parameter kein gültiger Socket ist. |
|
Der versuchte Vorgang wird für den Typ des Objekts, auf das verwiesen wird, nicht unterstützt. Dieser Fehler wird für einen Socket im Socket-Parameter für einen nicht unterstützten Sockettyp zurückgegeben (z. B. SOCK_RAW). |
Hinweise
Die RIOCreateRequestQueue-Funktion erstellt einen registrierten E/A-Socketdeskriptor unter Verwendung einer angegebenen Socket- und E/A-Vervollständigungswarteschlange. Eine Anwendung muss RIOCreateRequestQueue aufrufen, um eine RIO_RQ für einen Winsock-Socket abzurufen, bevor die Anwendung die Funktionen RIOSend, RIOSendEx, RIOReceive oder RIOReceiveEx verwenden kann. Um eine RIO_RQ zu erhalten, muss der Winsock-Socket Vervollständigungswarteschlangen für Senden und Empfangen zugeordnet sein, obwohl dieselbe Vervollständigungswarteschlange für beide verwendet werden kann.
Aufgrund der endlichen Größe von Vervollständigungswarteschlangen kann ein Socket einer Vervollständigungswarteschlange für Sende- und Empfangsvorgänge nur zugeordnet werden, wenn er garantiert, dass die Kapazität für die Gesamtabschlüsse in der Warteschlange nicht überschritten wird. Daher werden socketspezifische Grenzwerte durch den Aufruf der RIOCreateRequestQueue-Funktion festgelegt. Diese Grenzwerte werden sowohl während des RIOCreateRequestQueue-Aufrufs verwendet, um den ausreichenden Speicherplatz in den Vervollständigungswarteschlangen für die Socketanforderungen zu überprüfen, als auch während der Anforderungsinitiierungszeit, um sicherzustellen, dass die Anforderung nicht dazu führt, dass der Socket seine Grenzwerte überschreitet.
Die Sende- und Empfangswarteschlangen können mehreren Sockets zugeordnet werden. Die Größen der Sende- und Empfangswarteschlangen müssen größer oder gleich den Sende- und Empfangsgrößen aller angefügten Sockets sein. Wenn Anforderungswarteschlangen durch Schließen der Sockets mithilfe der Closesocket-Funktion geschlossen werden, werden diese Slots für die Verwendung durch andere Sockets freigegeben.
Hinweis
Aus Gründen der Effizienz werden der Zugriff auf die Vervollständigungswarteschlangen (RIO_CQ-Strukturen ) und Anforderungswarteschlangen (RIO_RQ-Strukturen ) nicht durch Synchronisierungsgrundsätze geschützt. Wenn Sie über mehrere Threads auf eine Vervollständigungs- oder Anforderungswarteschlange zugreifen müssen, sollte der Zugriff durch einen kritischen Abschnitt, eine schlanke Lesesperre oder einen ähnlichen Mechanismus koordiniert werden. Diese Sperre ist für den Zugriff durch einen einzelnen Thread nicht erforderlich. Verschiedene Threads können ohne Sperren auf separate Anforderungen/Vervollständigungswarteschlangen zugreifen. Die Notwendigkeit einer Synchronisierung tritt nur auf, wenn mehrere Threads versuchen, auf dieselbe Warteschlange zuzugreifen. Eine Synchronisierung ist auch erforderlich, wenn mehrere Threads senden und empfangen, die auf demselben Socket gesendet und empfangen werden, da die Sende- und Empfangsvorgänge die Anforderungswarteschlange des Sockets verwenden.
Wenn eine Anwendung die RIO_RQ verwendet, sollte die Anwendung die Closesocket-Funktion aufrufen, um den Socket zu schließen und die zugeordneten Ressourcen freizugeben.
Hinweis
Der Funktionszeiger auf die RIOCreateRequestQueue-Funktion muss zur Laufzeit abgerufen werden, indem die WSAIoctl-Funktion mit dem angegebenen SIO_GET_MULTIPLE_EXTENSION_FUNCTION_POINTER opcode aufgerufen wird. Der an die WSAIoctl-Funktion übergebene Eingabepuffer muss WSAID_MULTIPLE_RIO enthalten, einen global eindeutigen Bezeichner (GUID), dessen Wert die von Winsock registrierten E/A-Erweiterungsfunktionen identifiziert. Bei Erfolg enthält die von der WSAIoctl-Funktion zurückgegebene Ausgabe einen Zeiger auf die RIO_EXTENSION_FUNCTION_TABLE-Struktur , die Zeiger auf die von Winsock registrierten E/A-Erweiterungsfunktionen enthält. Die SIO_GET_MULTIPLE_EXTENSION_FUNCTION_POINTER IOCTL ist in der Headerdatei Ws2def.h definiert. Die WSAID_MULTIPLE_RIO GUID ist in der Headerdatei "Mswsock.h " definiert.
Windows Phone 8: Diese Funktion wird für Windows Phone Store-Apps auf Windows Phone 8 und höher unterstützt.
Windows 8.1 und Windows Server 2012 R2: Diese Funktion wird für Windows Store-Apps auf Windows 8.1, Windows Server 2012 R2 und höher unterstützt.
Anforderungen
Anforderung | Wert |
---|---|
Header | mswsock.h |