2016-08-12 7 views
0

Bei Verwendung eines SFML TcpListener auf dem Haupt-Thread, wie kann ich sofort die TcpListener::accept() Funktion stoppen? Zum Beispiel, wenn ich in der Lage sein würde, eine SIGINT zu erhalten und Dinge aufzuräumen. Um dies zu tun, müsste ich in der Lage sein, die TcpListener::accept()-Funktion Disconnected, oder Error zurückzugeben.Stoppt sofort SFML TcpListener

+0

Können Sie den Sockel von unten schließen? – user4581301

+0

@ user4581301 Wie würde ich das tun? –

+0

'TcpListener :: close'. [Dokumentation] (http://www.sfml-dev.org/documentation/2.0/classsf_1_1TcpListener.php#ae2c83ce5a64d50b68180c46bef0a7346) sagt: "Diese Funktion stoppt den Listener. Wenn der Socket nicht hört, hat diese Funktion keine Wirkung." – user4581301

Antwort

0

Danke an Sean Cline für den Vorschlag non-blocking mode und selectors.

Als Referenz blockieren Funktionen in SFML/Networking (ich bin nicht sicher über seine anderen Komponenten) standardmäßig, was bedeutet, dass sie nicht zurückkehren, bis sie ihren Zweck erfüllt haben (in meinem Fall eine TCP-Verbindung akzeptieren) . Wenn Sie non-blocking mode verwenden, wird die Funktion sofort zurückkehren und ihren Status zurückgeben. Für TcpListener::accept() wird sf::Socket::Status::Done zurückgegeben, wenn eine Verbindung akzeptiert wurde und die Aufgabe erfolgreich abgeschlossen wurde. Andernfalls könnte sf::Socket::Status::Disconnected oder sf::Socket::Status::NotReady zurückgegeben werden.

Wie für selectors, erlauben sie Ihnen, mehrere Sockets in einem einzigen Thread zu verwalten, und sind besonders nützlich, wenn Sie nicht wissen, welche Daten zuerst gesendet werden.