Empfangen von Vervollständigungsanzeigen

Für den Empfang von Vervollständigungsanzeigen stehen mehrere Optionen zur Verfügung, wodurch Anwendungen ein angemessenes Maß an Flexibilität erhalten. Dazu gehören: Warten (oder Blockieren) auf Ereignisobjekten, Abrufereignisobjekte und Socket-E/A-Abschlussroutinen.

Blockieren und Warten auf Abschlussanzeige

Anwendungen können blockieren, während darauf gewartet wird, dass ein oder mehrere Ereignisobjekte mithilfe der WSAWaitForMultipleEvents-Funktion festgelegt werden. In Windows Implementierungen wird der Prozess oder Thread tatsächlich blockiert. Da Windows Sockets 2-Ereignisobjekte als Windows-Ereignisse implementiert werden, kann auch die native Windows-Funktion WaitForMultipleObjects für diesen Zweck verwendet werden. Dies ist besonders nützlich, wenn der Thread sowohl auf Socket- als auch auf Nichtsocketereignisse warten muss.

Abruf der Vervollständigungsanzeige

Anwendungen, die nicht blockieren möchten, können die WSAGetOverlappedResult-Funktion verwenden, um den Abschlussstatus eines bestimmten Ereignisobjekts zu erhalten. Diese Funktion gibt an, ob der überlappende Vorgang abgeschlossen wurde, und ordnet bei Abschluss an, dass die WSAGetLastError-Funktion den Fehlerstatus des überlappenden Vorgangs abruft.

Verwenden von Socket-E/A-Vervollständigungsroutinen

Die Funktionen, die verwendet werden, um überlappende E/A zu initiieren ( WSASend, WSASendTo, WSARecv, WSARecvFrom), verwenden alle lpCompletionRoutine als optionalen Eingabeparameter. Dies ist ein Zeiger auf eine anwendungsspezifische Funktion, die aufgerufen wird, nachdem ein erfolgreich initiierter überlappende E/A-Vorgang abgeschlossen wurde (erfolgreich oder anderweitig). Die Vervollständigungsroutine folgt den gleichen Regeln wie für Windows-E/A-Vervollständigungsroutinen. Das heißt, die Vervollständigungsroutine wird erst aufgerufen, wenn sich der Thread in einem wartbaren Wartezustand befindet, z. B. wenn die Funktion WSAWaitForMultipleEvents mit dem festgelegten Flag aufgerufen fAlertable wird. Eine Anwendung, die die Abschlussroutinenoption für eine bestimmte überlappende E/A-Anforderung verwendet, verwendet möglicherweise nicht die Warteoption WSAGetOverlappedResult für dieselbe überlappende E/A-Anforderung.

Mit den Transporten kann eine Anwendung Sende- und Empfangsvorgänge innerhalb des Kontexts der Socket-E/A-Abschlussroutine aufrufen und garantieren, dass E/A-Abschlussroutinen für einen bestimmten Socket nicht geschachtelt werden. Dadurch können zeitempfindliche Datenübertragungen vollständig innerhalb eines präemptiven Kontexts erfolgen.

Zusammenfassung der überlappenden Vervollständigungsanzeigemechanismen

Die spezielle überlappende E/A-Vervollständigungsanzeige, die für einen bestimmten überlappenden Vorgang verwendet werden soll, wird durch die Angabe bestimmt, ob die Anwendung einen Zeiger auf eine Vervollständigungsfunktion, ob auf eine WSAOVERLAPPED-Struktur verwiesen wird, und durch den Wert des hEvent-Members innerhalb der WSAOVERLAPPED-Struktur (sofern angegeben). Die folgende Tabelle fasst die Vervollständigungssemantik für einen überlappenden Socket zusammen und zeigt die verschiedenen Kombinationen von lpOverlapped, hEvent und lpCompletionRoutine:

lpOverlapped hEvent lpCompletionRoutine Vervollständigungsanzeige
NULL Nicht zutreffend Wird ignoriert. Der Vorgang wird synchron abgeschlossen. Es verhält sich so, als wäre es ein nicht überladener Socket.
! Null NULL NULL Der Vorgang wird überlappend abgeschlossen, aber es gibt Windows sockets 2-unterstützten Vervollständigungsmechanismus. In diesem Fall kann der Vervollständigungsportmechanismus (sofern unterstützt) verwendet werden. Andernfalls wird keine Abschlussbenachrichtigung angezeigt.
! Null ! Null NULL Operation completes overlaped, notification by signaling event object. (Vorgang abgeschlossen überlappend, Benachrichtigung durch Signalisierung des Ereignisobjekts.
! Null Wird ignoriert. ! Null Der Vorgang schließt überlappende Benachrichtigungen ab, indem die Abschlussroutine geplant wird.