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::CloseAlso 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.