Canceled I/O: WSARecv mit ERROR_CONNECTION_ABORTED, obwohl nur WSASend abgebrochen wird



  • Hallo!

    Folgendes mir unerklärliches Verhalten: Clientprogramm auf Server 2003 baut Verbindung zum Serverprogramm auf, sendet pro Sekunde ein Ping-Paket in einem extra Thread.
    Beim Schließen des Clients wird der Thread beendet, das WSASend des Ping-Pakets könnte dabei noch ausstehend sein. MSDN sagt dazu, dass dieses WSASend dann abgebrochen wird ( http://msdn.microsoft.com/en-us/library/windows/desktop/ms742203 ). Und das wird es auch: ERROR_OPERATION_ABORTED.
    Doch was ich nicht verstehe: Noch davor kehrt WSARecv mit ERROR_CONNECTION_ABORTED zurück! Ohne, dass dieser Thread es jemals aufgerufen hätte!
    Wie kann das sein? Es sollten doch nur die I/O operations des beendenden Threads abgebrochen werden. Das einzige WSARecv wird in den workerthreads (IOCP) aufgerufen.

    Log:

    Close(): stop ping thread
    WSARecv error: ERROR_CONNECTION_ABORTED
    WSASend error: ERROR_OPERATION_ABORTED
    Connection::Close

    Also ich verstehe nicht, wie der WSARecv error zustande kommt, noch bevor closesocket() (in Connection::Close) jemals aufgerufen wird. Die log-writes sind natürlich gelockt.
    Ich habe auch getestet, ob es wirklich an dem Send liegt. Wenn ich in dem Ping-Thread noch auf alle Sends des Threads warte, kann ich diesen Fehler nicht reproduzieren. Mit Server 2012 bis jetzt auch nicht.

    😕


Anmelden zum Antworten