Ü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 für Sockets ausgeführt werden, die mit der Socketfunktion erstellt wurden, oder sockets, 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 blockierenden oder nicht blockierenden Modus 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 WSARecv- oder WSARecvFrom-Funktionen, um Puffer für den Empfang von Daten zur Verfügung zu stellen. Wenn ein oder mehrere Puffer vor dem Empfang der Daten durch das Netzwerk bereitgestellt werden, können diese Daten sofort beim Eintreffen des Benutzers in die Puffer 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 vorhanden sind, wenn Empfangspuffer bereitgestellt werden, werden sie sofort in die Puffer des Benutzers kopiert.
Wenn Daten eintreffen, wenn keine Empfangspuffer von der Anwendung bereitgestellt wurden, wird das Netzwerk auf den vertrauten synchronen Betriebsstil umgestellt. Das heißt, die eingehenden Daten werden intern gepuffert, bis die Anwendung einen Empfangsaufruf ausgibt und dadurch einen Puffer angibt, in den die Daten kopiert werden können. Eine Ausnahme ist, wenn die Anwendung setsockopt verwendet, um die Größe des Empfangspuffers auf 0 (null) festzulegen. In diesem Fall würden zuverlässige Protokolle nur den Empfang von Daten zulassen, wenn Anwendungspuffer bereitgestellt wurden, und Daten zu unzuverlässigen Protokollen würden verlorengehen.
Auf der sendenden Seite verwenden Anwendungen WSASend oder WSASendTo, um Zeiger auf gefüllte Puffer zu liefern, und stimmen dann zu, die Puffer nicht in irgendeiner Weise zu stören, bis das Netzwerk den Inhalt des Puffers verbraucht hat.
Überlappende Sende- und Empfangsaufrufe werden sofort zurückgegeben. Der Rückgabewert 0 gibt an, dass der E/A-Vorgang sofort abgeschlossen wurde und die entsprechende Abschlussanzeige bereits aufgetreten ist. Das heißt, das zugeordnete Ereignisobjekt wurde signalisiert, oder eine Abschlussroutine wurde in die Warteschlange eingereiht und wird ausgeführt, wenn der aufrufende Thread in den warnungsfähigen Wartezustand versetzt wird.
Der Rückgabewert SOCKET _ ERROR in Verbindung mit dem Fehlercode WSA IO _ _ PENDING gibt an, dass der überlappende Vorgang erfolgreich initiiert wurde und dass ein nachfolgender Hinweis bereitgestellt wird, wenn Sendepuffer genutzt wurden oder ein Empfangsvorgang abgeschlossen wurde. Bei Sockets im Bytestreamformat erfolgt die Abschlussanzeige jedoch immer dann, 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 keine Abschlussanzeige angezeigt wird.
Sende- und Empfangsvorgänge können sich überlappen. Die Empfangsfunktionen können mehrmals aufgerufen werden, um Empfangspuffer zur Vorbereitung eingehender Daten zu veröffentlichen, und die Sendefunktionen können mehrmals aufgerufen werden, um mehrere zu sendende Puffer in die Warteschlange zu stellen. Die Anwendung kann sich zwar darauf verlassen, dass eine Reihe von überlappenden Sendepuffern in der angegebenen Reihenfolge gesendet wird, die entsprechenden Vervollständigungshinweise können jedoch in einer anderen Reihenfolge auftreten. Ebenso können Puffer auf der empfangsseitigen Seite in der Reihenfolge gefüllt werden, in der sie bereitgestellt werden, aber die Vervollständigungshinweise können in einer anderen Reihenfolge auftreten.
In vielen Fällen überlappen sich Winsock-Vorgänge mit AcceptEx, ConnectEx, WSASend, WSARecv, TransmitFileund ähnlichen Funktionen. Das Verhalten ist jedoch für die fortgesetzte Verwendung eines Sockets nicht definiert, der ausstehende Vorgänge abgebrochen hat. Die closesocket-Funktion sollte nach dem Abbrechen eines überlappenden Vorgangs aufgerufen werden. Daher sollte die Closesocket-Funktion aufgerufen werden, um den Socket zu schließen, der schließlich alle ausstehenden Vorgänge beendet, anstatt die E/A direkt abzubrechen, um optimale Ergebnisse zu erzielen.
Das Feature für verzögerte Vervollständigung überlappender E/A ist auch für WSAIoctlverfügbar, bei dem es sich um eine erweiterte Version von ioctlsocket handelt.