Entsperren eines Gesperrten Winsock accept () - Aufruf
Bin ich mit Winsock unter VS 2008.
Habe ich einen thread gewidmet, um eingehende TCP-Verbindungsanforderungen über eine blockierende Aufruf von accept(). Wenn die Zeit kommt für meine app zum Herunterfahren, ich muss ja irgendwie die Blockierung dieser thread, so dass es ausführen kann, seine shutdown-Arbeit und beenden. Gibt es eine Möglichkeit, ich kann die Blockierung accept()?
Ich nach einer anderen Frage, falls es keine Möglichkeit gibt, um die Blockierung accept(). Die Frage ist: Wenn ich führen Sie einen hard-kill an den thread, blockiert accept(), wird nichts schlimmes passieren (Beschädigung von OS-Datenstrukturen, etc.)?
Dank,
Dave
- Können Sie nicht schließen Sie die Steckdose, die Sie blockiert sind? Dadurch wird
accept()
zurück. - IME, nur das beenden der app, während der accept() blockiert ist, ist auch gut so. Das OS wird sich bereinigen und es wird nichts kaputt gehen. Wenn du wirklich, unbedingt explizit zu bereinigen, dann schließen Sie die Steckdose aus einem anderen thread, wie vorgeschlagen, von den anderen Postern.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Der einzige Weg, um die Blockierung eine Blockierung
accept()
ist das schließen des socket aus einem anderen thread. Andernfalls müssen Sie setzen der socket in den non-blocking Modus und verwendenselect()
(die nicht die Unterstützung einer timeout) zu erkennen, wennaccept()
aufgerufen werden kann, ohne zu blockieren.select()
, überprüfungselect()
's return Wert; zweiten thread erfolgreich istclosesocket()
; Dritte thread öffnet einen neuen socket mit den gleichen handle-Wert; erste thread fortgesetzt wartet in derselect()
aber jetzt für eine andere Buchse mit dem gleichen handle-Wert.select()
Ansatz, den ich erwähnte, wird der zweite thread nicht aufrufen müssenclosesocket()
. Es kann einfach ein signal, dass der erste thread aussieht, so kann es in der Nähe seiner eigenen sockel an seiner frühesten Bequemlichkeit. Die Verwendung vonselect()
sorgt dafür, dass der erste thread ist nicht gesperrt indefinately inaccept()
, indem Sie einfach den Aufruf nichtaccept()
bisselect()
sagt.Einem robusten Weg, um die Blockierung der accept () - Aufruf aus einem anderen thread zu erstellen Sie eine Verbindung mithilfe der connect(). Natürlich, der thread muss wissen, welche IP-Adresse und port wird gelauscht.
Ein Ansatz, den ich in der Vergangenheit verwendet habe zu liefern, ist ein timeout-Wert für die accept() - und wenn es timesout, so prüfen Sie ein "cancel" - flag, falls gesetzt, Sie zu stoppen - wenn nicht, gehen Sie zurück in die Schleife, mit der accept () - Aufruf.
Ich denke, dass die Tötung der thread würde funktionieren, aber man sollte vorsichtig sein, um sicherzustellen, es ist dein thread und, zum Beispiel, nicht ein .NET-threadpool-thread.
EDIT: Remy hat Recht, und zu denken, ich selbst habe eine schnelle google, um zu überprüfen, die Struktur, die ich mich erinnere gibt es - zu schnell, wie es scheint. Blush/etc.
Wenn Sie gewährleisten wollen, dass die blockierende Semantik, würde Sie sehen schließen Sie die Buchse aus einem anderen thread (oder Abbruch Ihres blockierende Threads) wäre der Weg zu gehen.
accept()
in WinSock nicht über einen timeout-parameter der eigenen. Sie müssen dann den socket in den non-blocking Modus und verwenden Sie dannselect()
(die nicht die Unterstützung einer timeout) zu erkennen, wennaccept()
aufgerufen werden kann, ohne zu blockieren.Geradlinig und spezifisch für Windows, Sie Closesocket() zurückgibt, ohne Fehler und verstopfte ein thread Aufruf von accept().
Abruf von select() ist nicht wirklich das, was Sie wollen!
Anschließen von einem zusätzlichen thread ist nicht wirklich das, was Sie wollen!
E. g. für linux-close(socket) nicht entblocken ein listening-thread,
aber shutdown(socket, SHUT_RD) werden; neben der socket geschlossen werden muss.