Freigeben über


Überlappende E/A- und Ereignisobjekte

Windows Sockets 2 unterstützt überlappende E/A und alle Transportanbieter unterstützen diese Funktion. Überlappende E/A folgt dem in Windows eingerichteten Modell und kann auf Sockets ausgeführt werden, die mit der Socket funktion oder Sockets erstellt wurden, die mit der WSASocket--Funktion mit dem WSA_FLAG_OVERLAPPED im dwFlags Parameter festgelegten Flag erstellt wurden.

Anmerkung

Das Erstellen eines Sockets mit dem überlappenden Attribut hat keine Auswirkungen darauf, ob sich ein Socket derzeit im Blockierungs- oder Nichtblockierungsmodus befindet. Sockets, die mit dem überlappenden Attribut erstellt wurden, können verwendet werden, um überlappende E/A auszuführen. Dadurch wird der Blockierungsmodus eines Sockets nicht geändert. Da überlappende E/A-Vorgänge nicht blockiert werden, ist der Blockierungsmodus eines Sockets für diese Vorgänge irrelevant.

 

Für den Empfang verwenden Anwendungen die WSARecv oder WSARecvFrom Funktionen, um Puffer zu liefern, in die Daten empfangen werden sollen. Wenn ein oder mehrere Puffer vor dem Zeitpunkt, zu dem Daten vom Netzwerk empfangen wurden, gepostet werden, können diese Daten sofort beim Eintreffen in die Puffer des Benutzers eingefügt werden. Dadurch kann der Kopiervorgang vermieden werden, der andernfalls zum Zeitpunkt des Aufrufs der recv oder recvfrom-Funktion auftreten würde. Wenn Daten bereits vorhanden sind, wenn Empfangspuffer gepostet werden, wird sie sofort in die Puffer des Benutzers kopiert.

Wenn Daten eintreffen, wenn keine Empfangspuffer von der Anwendung gepostet wurden, greift das Netzwerk auf den vertrauten synchronen Betriebsstil zurück. Das heißt, die eingehenden Daten werden intern gepuffert, bis die Anwendung einen Empfangsaufruf ausgibt und dadurch einen Puffer bereitstellt, in den die Daten kopiert werden können. Eine Ausnahme ist, wenn die Anwendung setockopt- verwendet, um die Größe des Empfangspuffers auf Null festzulegen. In diesem Fall würden zuverlässige Protokolle nur zulassen, dass Daten empfangen werden, wenn Anwendungspuffer gepostet wurden und Daten zu unzuverlässigen Protokollen verloren gehen.

Auf der Sendenseite verwenden Anwendungen WSASend oder WSASendTo, um Zeiger auf gefüllte Puffer zu liefern und sich dann darauf zu einigen, die Puffer auf irgendeine Weise zu stören, bis das Netzwerk den Inhalt des Puffers genutzt hat.

Überlappende Sende- und Empfangsanrufe werden sofort zurückgegeben. Ein Rückgabewert von Null gibt an, dass der E/A-Vorgang sofort abgeschlossen wurde und dass die entsprechenden Abschlussanzeigen bereits aufgetreten sind. Das heißt, das zugeordnete Ereignisobjekt wurde signalisiert oder eine Abschlussroutine wurde in die Warteschlange gestellt und wird ausgeführt, wenn der aufrufende Thread in den warnbaren Wartezustand wechselt.

Ein Rückgabewert von SOCKET_ERROR gekoppelt mit einem Fehlercode von WSA_IO_PENDING gibt an, dass der überlappende Vorgang erfolgreich initiiert wurde und dass eine nachfolgende Angabe bereitgestellt wird, wenn Sendepuffer verbraucht wurden oder wenn ein Empfangsvorgang abgeschlossen wurde. Bei Sockets, die Bytestream-Formatvorlage sind, tritt die Abschlussanzeige jedoch immer dann auf, wenn die eingehenden Daten erschöpft sind, unabhängig davon, ob die Puffer voll sind. Jeder andere Fehlercode gibt an, dass der überlappende Vorgang nicht erfolgreich initiiert wurde und dass keine Abschlussanzeige angezeigt wird.

Sowohl Sende- als auch Empfangsvorgänge können überlappen. Die Empfangsfunktionen können mehrmals aufgerufen werden, um Puffer bei der Vorbereitung auf eingehende Daten zu posten, und die Sendefunktionen können mehrmals aufgerufen werden, um mehrere zu sendende Puffer in die Warteschlange zu stellen. Die Anwendung kann zwar auf eine Reihe überlappender Sendepuffer zurückgreifen, die in der angegebenen Reihenfolge gesendet werden, die entsprechenden Abschlussanzeigen können jedoch in einer anderen Reihenfolge auftreten. Ebenso können Puffer auf der empfangenden Seite in der Reihenfolge ausgefüllt werden, in der sie angegeben werden, aber die Abschlussanzeigen können in einer anderen Reihenfolge auftreten.

In vielen Fällen überlappen Winsock-Vorgänge mit AcceptEx-, ConnectEx-, WSASend-, WSARecv-, TransmitFile-und ähnliche Funktionen können abgebrochen werden. Das Verhalten ist jedoch für die fortgesetzte Verwendung eines Sockets, der ausstehende Vorgänge abgebrochen hat, nicht definiert. Die closesocket--Funktion sollte aufgerufen werden, nachdem ein überlappender Vorgang abgebrochen wurde. Daher sollte die closesocket--Funktion aufgerufen werden, um optimale Ergebnisse zu erzielen, anstatt die E/A-Funktion direkt abzubrechen, um den Socket zu schließen, wodurch schließlich alle ausstehenden Vorgänge beendet werden.

Die Funktion zum verzögerten Abschluss überlappender E/A ist auch für WSAIoctlverfügbar, die eine erweiterte Version von ioctlsocketist.