WINSOCK : recv könnte blockieren, was nun ?
-
Hallo, folgendes Szenario :
Eine Anwendung hat einen Thread, der die GUI bedient und je nach Bedarf einen zweiten Thread, der Netzwerkaufgaben erledigen soll.
Nun mal angenommen, der zweite Thread bleibt in recv () hängen (warum auch immer).
Würde es funktionieren, daß dann der erste Thread irgendwas (Fehlermeldung z.B.) an den socket sendet um den zweiten Thread aus recv () wieder herauszukriegen ?
Oder anders gefragt :
Darf der erste Thread den socket "einfach so" schließen, obwohl der zweite Thread noch in recv () hängt ?
-
wenn ich dich richtig verstanden habe,
dann gibts nur die möglichkeit, dass der erste thread den zweiten thread killt. direkt irgendwo rausholen wird wohl nicht gehen, denke ich..
-
TerminateThread sollte es aber nicht sein.
Ich dachte eher an DuplicateHandle mit DUPLICATE_CLOSE_SOURCE und CloseHandle.
Wenn der socket ungültig wird, müsste eigentlich das Betriebssystem den zweiten Thread darüber "in Kenntniss setzen" und der zweite Thread kann "normal" auslaufen, oder ?
-
hm... einen Versuch wäre es wert. Obs klappt weiß ich nicht. Wäre aber mal interessant...
-
closesocket: Any pending blocking, asynchronous calls issued by any thread in this process are canceled without posting any notification messages.
-
Lieber nicht : "closesocket : The routine can block if acting on a blocking socket."
Das Problem ist ja grade, daß der zweite Thread recv () aufgerufen hat, aber vom Aufruf nicht zurückkehren will.
Die DuplicateHandle-Variante funktioniert (offensichtlich) sogar bei allen Funktionen, die einen socket brauchen. Der Thread kommt jedesmal vom Aufruf zurück und kann "weiterlaufen".
Allerdings weiß ich nicht, ob das irgendwelche Seiteneffekte hat.
-
Du könntest select benutzen, um das blocken zu umgehen.
Dann mit Events oder ähnlichem gesteuert beenden.
-
Zu spät !

Jetzt habe ich mich auf die DuplicateHandle-Variante eingeschossen. Dann kehrt der zweite Thread, egal in welcher Funktion er grade steckengeblieben ist, sofort mit einem SOCKET_ERROR zurück und kann dann kontrolliert auslaufen.
Bleibt nur noch die Frage, ob man den duplizierten socket mit CloseHandle oder mit closesocket freigeben soll.