Frage zu WSARecv ()



  • Hi,

    ich benutze einen IO Completion Port um auf mehrere Clients reagieren zu können. Damit der Completion Port überhaupt erst in Aktion tritt muss man ja immer, bevor man Daten empfangen möchte, WSARecv () mit den entsprechenden Overlapped-Paramtern aufrufen. Dieses wiederum kann entweder 0 zurückgeben, was bedeutet, dass die Operation bereits erfolgt ist, oder SOCKET_ERROR und WSAGetLastError () auf WSA_IO_PENDING setzen, was bedeutet, dass noch keine Daten da waren und die Operation "gepostet" wurde.

    Wenn jetzt WSARecv () 0 zurück gibt, also die Operation schon beendet ist, wird der empfangene Inhalt wie erwartet in den Zielbuffer kopiert. Allerdings erhalte ich am IO Completion Port dennoch die Mitteilung über den Abschluss der Operation (obwohl diese schon erfolgt ist und demnach keine andere, asynchrone Mitteilung mehr erforderlich wäre). Der Completion Port meldet die entsprechende Anzahl empfangener Bytes, ein Aufruf von WSAGetOverlappedResult () liefert allerdings 0 Bytes.

    Wie soll ich die Sache jetzt angehen? Soll ich gleich wenn WSARecv () fertig geworden ist die entsprechende Aktion im Programm auslösen und das Ereignis am Completion Port ignorieren (sicherlich schneller) oder soll ich, selbst wenn WSARecv () fertig war, erstmal nichts tun, sondern auf das Ereignis am Completion Port warten (bestimmt sauberer, allerdings mehr Overhead)?

    MfG, devkid.



  • Ab Vista gibts SetFileCompletionNotificationModes / FILE_SKIP_COMPLETION_PORT_ON_SUCCESS



  • Ok, vielen Dank. 🙂 Dann werde ich wohl bei den älteren Windows-Versionen einfach die folgenden Events im Completion Port ignorieren.


Anmelden zum Antworten