Freigeben über


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
WSAEINVAL
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.
WSAENOBUFS
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.
WSAENOTSOCK
Der Deskriptor ist kein Socket. Dieser Fehler wird zurückgegeben, wenn der Socket-Parameter kein gültiger Socket ist.
WSAEOPNOTSUPP
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