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 folgen dem in Windows eingerichteten Modell und können für Sockets ausgeführt werden, die mit der Socketfunktion oder sockets erstellt wurden, die mit der WSASocket-Funktion erstellt wurden, wobei das WSA_FLAG_OVERLAPPED-Flag im dwFlags-Parameter festgelegt ist.

Hinweis

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-Vorgänge 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 Funktionen WSARecv oder WSARecvFrom , um Puffer zur Verfügung zu stellen, in die Daten empfangen werden sollen. Wenn ein oder mehrere Puffer vor dem Zeitpunkt, zu dem Daten vom Netzwerk empfangen wurden, gebucht werden, könnten diese Daten sofort beim Eintreffen in den Puffern des Benutzers platziert werden. Daher kann der Kopiervorgang vermieden werden, der andernfalls zum Zeitpunkt des Aufrufs der recv - oder recvfrom-Funktion auftreten würde. Wenn Daten bereits beim Posten von Empfangspuffern vorhanden sind, werden sie sofort in die Puffer des Benutzers kopiert.

Wenn Daten eintreffen, wenn von der Anwendung keine Empfangspuffer gepostet wurden, greift das Netzwerk auf den bekannten 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 setsockopt verwendet, um die Größe des Empfangspuffers auf 0 festzulegen. In diesem instance würden zuverlässige Protokolle den Empfang von Daten nur ermöglichen, wenn Anwendungspuffer veröffentlicht wurden und Daten zu unzuverlässigen Protokollen verloren gingen.

Auf der Sendeseite verwenden Anwendungen WSASend oder WSASendTo , um Zeiger an gefüllte Puffer zu liefern, und stimmen dann zu, die Puffer in keiner Weise zu stören, bis das Netzwerk den Inhalt des Puffers verbraucht hat.

Überlappende Sende- und Empfangsanrufe werden sofort zurückgegeben. Ein Rückgabewert von 0 gibt an, dass der E/A-Vorgang sofort abgeschlossen wurde und dass die entsprechende Vervollständigungsanzeige bereits aufgetreten ist. Das heißt, das zugeordnete Ereignisobjekt wurde signalisiert, oder eine Vervollständigungsroutine wurde in die Warteschlange gestellt und wird ausgeführt, wenn der aufrufende Thread den warnbaren Wartezustand erreicht.

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 im Byte-Stream-Format tritt die Vervollständigungsanzeige 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 gestartet wurde und dass keine Vervollständigungsanzeige angezeigt wird.

Sowohl Sende- als auch Empfangsvorgänge können überlappen. Die Empfangsfunktionen können mehrmals aufgerufen werden, um Empfangspuffer zur Vorbereitung auf eingehende Daten zu postieren, und die Sendefunktionen können mehrmals aufgerufen werden, um mehrere zu sendende Puffer in die Warteschlange zu stellen. Die Anwendung kann sich zwar auf eine Reihe von überlappenden Sendepuffern verlassen, die in der angegebenen Reihenfolge gesendet werden, die entsprechenden Vervollständigungsanzeigen können jedoch in einer anderen Reihenfolge auftreten. Ebenso können Puffer auf der Empfangsseite in der Reihenfolge gefüllt werden, in der sie bereitgestellt werden, aber die Vervollständigungsanzeigen können in einer anderen Reihenfolge auftreten.

In vielen Fällen können Winsock-Vorgänge mit AcceptEx, ConnectEx, WSASend, WSARecv, TransmitFile und ähnlichen Funktionen 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. Aus diesem Grund sollte die Closesocket-Funktion aufgerufen werden, um den Socket zu schließen, wodurch schließlich alle ausstehenden Vorgänge beendet werden.

Die Funktion zur verzögerten Vervollständigung von überlappenden E/A-Vorgängen ist auch für WSAIoctl verfügbar, eine erweiterte Version von ioctlsocket.