?
So!
Also ich habe jetzt im OVERLAPPED die flags "flying" und "stoprequest" sowie ein Event, das ausgelöst wird, wenn der IO-Completion-Handler solch ein OVERLAPPED in die Hände bekommt und "stoprequest" true ist.
Wenn man die Datei nun schließt, wird, falls "flying" true ist, "stoprequest" auf true gesetzt und auf das event gewartet.
"flying" wird überhaupt nur dann auf false gesetzt, wenn der IO-Completion-Handler ein Paket abgearbeitet hat und keine neue Lese-Operation gestartet wurde. Ich verlasse mich damit darauf, dass jede begonnene Datei-Operation auf jeden Fall zu einem Completion-Port-Paket führt.
Ich konnte mir keine Situation vorstellen, in der das nicht klappt und mein Testprogramm läuft jetzt eine halbe Stunde durch, erzeugt neue Verbindungen und schließt sie wieder. (Edit: Wobei, die Konstellation könnte so ungünstig sein, dass "stoprequest" gesetzt wird, wenn der Completion-Thread gerade flying auf false setzt -.-)
Aber jetzt tue ich ja genau nicht das, was von euch und der MSDN empfohlen wurde: Der IO-Completion-Thread ist dafür zuständig, das OVERLAPPED auszulöschen (Im Prinzip könnte er das auch, aber so wie ich die Sache handhabe macht es ja gar keinen Unterschied mehr, weil beim Destruktor vom Datei-Objekt auf jeden Fall kein IO-Paket mehr unterwegs ist).