2016-08-12 3 views
0

При использовании SFML TcpListener в основном потоке, как я могу немедленно остановить функцию TcpListener::accept()? Например, если бы я хотел получить SIGINT и чистить вещи. Для этого мне нужно было бы вернуть функцию TcpListener::accept() Disconnected или Error.Мгновенно остановить SFML TcpListener

+0

Можете ли вы закрыть розетку из-под нее? – user4581301

+0

@ user4581301 как бы я это сделал? –

+0

'TcpListener :: close'. [Документация] (http://www.sfml-dev.org/documentation/2.0/classsf_1_1TcpListener.php#ae2c83ce5a64d50b68180c46bef0a7346) говорит: «Эта функция изящно останавливает слушателя. Если сокет не прослушивается, эта функция не действует». – user4581301

ответ

0

спасибо Sean Cline за то, что вы указали non-blocking mode и selectors.

Для справки, функции SFML/Networking (я не уверен в других компонентах) блокируются по умолчанию, а это означает, что они не вернутся, пока они не достигнут своей цели (в моем случае, принимая TCP-соединение) , Используя non-blocking mode, функция немедленно вернется, возвращая ее статус. Для TcpListener::accept() он вернет sf::Socket::Status::Done, если было принято соединение, и оно успешно завершило задачу. В противном случае он может вернуться sf::Socket::Status::Disconnected, или sf::Socket::Status::NotReady.

Что касается selectors, они позволяют управлять несколькими сокетами в одном потоке и особенно полезны, когда вы не знаете, кто будет отправлять данные в первую очередь.

Смежные вопросы