Überlappende E/A- und Ereignisobjekte

Windows Sockets 2 unterstützt überlappende E/A und erfordert, dass alle Transportanbieter diese Funktion unterstützen. Überlappende E/A folgt dem in Windows festgelegten Modell und kann nur auf Sockets, die durch die WSASocket-Funktion mit festgelegtem WSA_FLAG_OVERLAPPED-Flag erstellt wurden, oder Sockets, die über die socket-Funktion erstellt wurden, ausgeführt werden.

Hinweis  Einen Socket mit dem überlappenden Attribut zu erstellen hat keine Auswirkungen darauf, ob ein Socket gerade im blockierenden oder nicht blockierenden Modus ist. Mit dem WSA_FLAG_OVERLAPPED-Attribut erstellte Sockets können verwendet werden, um überlappende E/A auszuführen — der blockierende Modus eines Sockets wird dadurch nicht geändert. Da überlappende E/A-Vorgänge nicht blockieren, ist der blockierende Modus eines Sockets für diese Vorgänge irrelevant.

Zum Empfangen geben Anwendungen der WSARecv-Funktion oder der WSARecvFrom-Funktion Puffer an, die für den Empfang von Daten verwendet werden sollen. Wenn ein oder mehrere Puffer vor dem Zeitpunkt bereitgestellt werden, zu dem Daten vom Netzwerk empfangen werden, können diese Daten beim Eingang sofort in den Puffern des Benutzers eingefügt werden. So kann der Kopiervorgang vermieden werden, der andernfalls zu dem Zeitpunkt auftreten würde, zu dem die recv-Funktion oder recvfrom-Funktion aufgerufen wird. Wenn Daten bereits vorhanden sind, wenn Empfangspuffer bereitgestellt werden, werden sie sofort in die Puffer des Benutzers kopiert.

Wenn Daten ankommen, solange noch keine Empfangspuffer von der Anwendung bereitgestellt wurden, greift das Netzwerk auf das bekannte synchrone Vorgangsformat zurück. Das heißt, die eingehenden Daten werden intern solange gepuffert, bis die Anwendung eine Empfangsfunktion aufruft und dadurch Puffer bereitstellt, in die Daten kopiert werden können. Eine Ausnahme hierzu wäre, wenn die Anwendung mithilfe von setsockopt die Größe des Empfangspuffers auf 0 (Null) festlegen würde. In diesem Fall würden zuverlässige Protokolle den Empfang von Daten nur dann zulassen, wenn Anwendungspuffer bereitgestellt worden wären, und bei unzuverlässigen Protokollen gingen Daten verloren.

Auf der Senderseite geben Anwendungen mithilfe von WSASend oder WSASendTo Zeiger auf gefüllte Puffer an und erklären dann, die Puffer solange in keiner Weise zu stören, bis das Netzwerk den Inhalt der Puffer genutzt hat.

Überlappende Aufrufe zum Senden und Empfangen geben sofort die Steuerung zurück. Ein Rückgabewert von 0 (Null) gibt an, dass der E/A-Vorgang sofort abgeschlossen wurde und dass die entsprechende Abschlussanzeige bereits ausgegeben wurde. Das heißt, das zugeordnete Ereignisobjekt wurde signalisiert, oder eine Abschlussroutine wurde in die Warteschlange eingefügt und wird ausgeführt, wenn der aufrufende Thread in den Wartezustand mit Alarmbereitschaft übergeht.

Der Rückgabewert SOCKET_ERROR gibt in Verbindung mit dem Fehlercode WSA_IO_PENDING an, dass der überlappende Vorgang erfolgreich initiiert wurde und dass eine nachfolgende Anzeige bereitgestellt wird, wenn Sendepuffer verbraucht worden sind oder ein Empfangsvorgang abgeschlossen worden ist. Für Sockets im Bytedatenstromformat gilt jedoch, dass die Abschlussanzeige unabhängig davon, ob die Puffer voll sind, jedes Mal ausgegeben wird, wenn die eingehenden Daten aufgebraucht sind. Jeder andere Fehlercode gibt an, dass der überlappende Vorgang nicht erfolgreich initiiert wurde und dass keine Abschlussanzeige zu erwarten ist.

Sowohl Sende- als auch Empfangsvorgänge können überlappt werden. Die Empfangsfunktionen können mehrmals aufgerufen werden, um Empfangspuffer für eingehende Daten bereitzustellen, und die Sendefunktionen können mehrmals aufgerufen werden, um mehrere Puffer mit zu sendenden Daten in die Warteschlange einzufügen. Die Anwendung kann zwar erwarten, dass eine Reihe von überlappenden Sendepuffern in der Reihenfolge, in der sie angegeben sind, gesendet werden, die entsprechenden Abschlussanzeigen können jedoch in einer anderen Reihenfolge ausgegeben werden. Ebenso können Puffer auf der empfangenden Seite in der Reihenfolge, in der sie angegeben werden, gefüllt werden, aber die Abschlussanzeigen können in einer anderen Reihenfolge auftreten.

In vielen Fällen können überlappende Winsock-Vorgänge, die AcceptEx, ConnectEx, WSASend, WSARecv, TransmitFile und ähnliche Funktionen verwenden, abgebrochen werden. Das Verhalten ist jedoch in Bezug auf die weitere Verwendung eines Sockets, der ausstehende Vorgänge abgebrochen hat, undefiniert. Die closesocket-Funktion sollte aufgerufen werden, nachdem ein überlappender Vorgang abgebrochen wurde. Um optimale Ergebnisse zu erhalten, sollten E/A-Vorgänge nicht direkt abgebrochen, sondern die closesocket-Funktion aufgerufen werden, um den Socket zu schließen, woraufhin schließlich alle ausstehenden Vorgänge beendet werden.

Die verzögerte Abschlussfunktion überlappender E/A-Vorgänge ist auch für die WSAIoctl-Funktion, eine verbesserte Version von ioctlsocket, verfügbar.

 

 

Anzeigen:
© 2014 Microsoft