LPFN_RIODEQUEUECOMPLETION Rückruffunktion (mswsock.h)

Die RIODequeueCompletion-Funktion entfernt Einträge aus einer E/A-Vervollständigungswarteschlange für die Verwendung mit den registrierten Winsock-E/A-Erweiterungen.

Syntax

LPFN_RIODEQUEUECOMPLETION LpfnRiodequeuecompletion;

ULONG LpfnRiodequeuecompletion(
  RIO_CQ CQ,
  PRIORESULT Array,
  ULONG ArraySize
)
{...}

Parameter

CQ

Ein Deskriptor, der eine E/A-Vervollständigungswarteschlange identifiziert.

Array

Ein Array von RIORESULT-Strukturen , um die Beschreibung der vervollständigten Vervollständigungen zu empfangen.

ArraySize

Die maximale Anzahl der zu schreibenden Einträge im Array .

Rückgabewert

Wenn kein Fehler auftritt, gibt die RIODequeueCompletion-Funktion die Anzahl der Vervollständigungseinträge zurück, die aus der angegebenen Vervollständigungswarteschlange entfernt wurden. Andernfalls wird der Wert RIO_CORRUPT_CQ zurückgegeben, um anzugeben, dass der Zustand der im CQ-Parameter übergebenen RIO_CQ aufgrund von Speicherbeschädigung oder Missbrauch der RIO-Funktionen beschädigt wurde.

Hinweise

Die RIODequeueCompletion-Funktion entfernt Einträge aus einer E/A-Vervollständigungswarteschlange für Sende- und Empfangsanforderungen mit den registrierten Winsock-E/A-Erweiterungen.

Die RIODequeueCompletion-Funktion ist der Mechanismus, mit dem eine Anwendung abgeschlossene Sende- und Empfangsanforderungen ermitteln kann. Eine Anwendung ruft normalerweise die RIODequeueCompletion-Funktion auf, nachdem sie eine Benachrichtigung basierend auf der Methode erhalten hat, die bei der RIONotify-Funktion registriert ist, wenn die Abschlusswarteschlange nicht leer ist. Das Benachrichtigungsverhalten für eine E/A-Vervollständigungswarteschlange wird festgelegt, wenn die RIO_CQ erstellt wird. Die RIO_NOTIFICATION_COMPLETION Struktur, die das Benachrichtigungsverhalten bestimmt, wird an die RIOCreateCompletionQueue-Funktion übergeben, wenn ein RIO_CQ erstellt wird.

Wenn die RIODequeueCompletion-Funktion abgeschlossen ist, enthält der Array-Parameter ein Array von Zeigern auf RIORESULT-Strukturen für die abgeschlossenen Sende- und Empfangsanforderungen, die entfernt wurden. Die Member der zurückgegebenen RIORESULT-Strukturen liefern Informationen über den Abschluss status der abgeschlossenen Anforderung und die Anzahl der übertragenen Bytes. Jede zurückgegebene RIORESULT-Struktur enthält auch einen Socketkontext und einen Anwendungskontext, mit dem die spezifische abgeschlossene Anforderung identifiziert werden kann.

Wenn die im CQ-Parameter übergebene E/A-Vervollständigungswarteschlange ungültig oder beschädigt ist, gibt die RIODequeueCompletion-Funktion die Anzahl der RIO_CORRUPT_CQ zurück.

Die RIODequeueCompletion-Funktion gibt den Wert 0 (null) zurück, wenn keine abgeschlossenen Sende- oder Empfangsanforderungen vorhanden sind, die aus der Warteschlange entfernt werden sollen.

Erst nachdem der Abschluss einer Anforderung aus der Warteschlange entfernt wurde, gibt das System die Zuordnung für den Puffer und die Pufferregistrierung zusammen mit der Kontingentgebühr frei.

Hinweis

Aus Effizienzgründen werden der Zugriff auf die Abschlusswarteschlangen (RIO_CQ Strukturen) und Anforderungswarteschlangen (RIO_RQ Strukturen) nicht durch Synchronisierungsgrundtypen 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 Anforderungs-/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.

 

Hinweis

Der Funktionszeiger auf die RIODequeueCompletion-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 Ws2def.h-Headerdatei 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 ab Windows Phone 8 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.

Threadsicherheit

Wenn mehrere Threads versuchen, mithilfe der RIODequeueCompletion-Funktion auf dieselbe RIO_CQ zuzugreifen, muss der Zugriff durch einen kritischen Abschnitt, eine Schreibsperre für schlanke Leser oder einen ähnlichen Mechanismus für gegenseitigen Ausschluss koordiniert werden. Wenn die Abschlusswarteschlangen nicht freigegeben werden, ist kein gegenseitiger Ausschluss erforderlich.

Anforderungen

Anforderung Wert
Header mswsock.h