【问题标题】:Instantly stop SFML TcpListener立即停止 SFML TcpListener
【发布时间】:2016-12-18 21:10:37
【问题描述】:

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

【问题讨论】:

  • 你能把插座从下面关掉吗?
  • @user4581301 我该怎么做?
  • TcpListener::closeDocumentation 说,“这个函数优雅地停止监听器。如果套接字没有监听,这个函数就没有效果。”
  • @user4581301 再次查看文档,似乎应该,让我看看我是否做了一些愚蠢的事情。
  • @user4581301 不,我必须连接到侦听器,以便它可以接受连接并继续执行。

标签: c++ multithreading networking tcp sfml


【解决方案1】:

感谢 Sean Cline 建议 non-blocking modeselectors

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-11
    • 1970-01-01
    • 2015-10-09
    • 2021-05-12
    • 1970-01-01
    • 2011-12-03
    • 2023-03-18
    相关资源
    最近更新 更多