2016-08-12 124 views
0

在主线程上使用SFML TcpListener时,如何立即停止TcpListener::accept()函数?例如,如果我想能够收到SIGINT并清理干净。为此,我需要能够使TcpListener::accept()函数返回断开连接或错误。立即停止SFML TcpListener

+0

你可以从下面关闭插座吗? – user4581301

+0

@ user4581301我该怎么做? –

+0

'TcpListener :: close'。 [Documentation](http://www.sfml-dev.org/documentation/2.0/classsf_1_1TcpListener.php#ae2c83ce5a64d50b68180c46bef0a7346)说:“这个函数正常地停止监听器,如果socket没有监听,这个函数不起作用。” – user4581301

回答

0

感谢Sean Cline建议non-blocking modeselectors

作为参考,SFML /网络中的函数(我不确定其它组件)在默认情况下处于阻塞状态,这意味着它们在完成目的之前不会返回(在我的情况下接受TCP连接) 。通过使用non-blocking mode,函数将立即返回,并返回其状态。对于TcpListener::accept(),如果有连接被接受并且成功完成任务,它将返回sf::Socket::Status::Done。否则,它可能会返回sf::Socket::Status::Disconnectedsf::Socket::Status::NotReady

至于selectors,它们允许您在单个线程上管理多个套接字,特别适用于不知道哪个数据先发送数据。