【问题标题】:How to check if socket is closed in Boost.Asio?如何检查 Boost.Asio 中的套接字是否已关闭?
【发布时间】:2010-10-23 13:13:19
【问题描述】:

检查远程连接的套接字是否关闭的最简单方法是什么? socket::is_open() 即使在远程端关闭也会返回 true(我使用的是 boost::asio::ip::tcp::socket)。

我可以尝试从流中读取并查看它是否成功,但我必须更改程序的逻辑以使其以这种方式工作(我不希望此时从流中提取数据支票)。

【问题讨论】:

  • 为什么需要知道远程连接是否已经关闭?
  • 另外,您使用的是自己设计的应用协议还是标准协议?
  • 我正在编写一个基本的聊天程序,我需要通知用户其他人关闭了应用程序。我有自己的协议,并且已经添加了“退出”消息。唯一的缺点是如果应用程序被杀死/崩溃/等,它不会被发送。
  • 您的问题格式不正确。您要求的是一种检测 connection 是否被对等方关闭的方法。
  • 也许您可以使用 boost::asio::null_buffers 实例作为缓冲区参数执行异步或同步读取?

标签: c++ boost sockets boost-asio


【解决方案1】:

只需检查async_receive 处理程序中的boost::asio::error::eof 错误。这意味着连接已关闭。这是唯一正确的方法。

【讨论】:

    【解决方案2】:

    是否提供增强窥视功能?大多数套接字实现都有一种读取数据的方法,而无需将其从队列中删除,因此您可以稍后再次读取它。这似乎可以满足您的要求。

    在快速浏览了 asio 文档后,我无法准确找到我所期望的,但这并不意味着它不存在。

    对于初学者,我建议this

    【讨论】:

    • 是的,你是对的。您可以将标志传递给“接收”方法,告诉它不要删除数据。我使用的是“read_some”方法,它没有这个标志参数。感谢您指出!
    • 假设你已经设置了套接字和响应,那么你可以设置一个流,例如std::istream myhttpstream(&presponse);然后你可以使用 std::istream::peek() 函数。
    • 我这样做:received = socket().receive(boost::asio::buffer(buf), tcp::socket::message_peek);
    【解决方案3】:

    如果连接已被对等方彻底关闭,您应该在读取时获得 EOF。否则,我通常会 ping 以确定连接是否真的存在。

    【讨论】:

    • ...我需要阅读才能获得 EOF。估计那时候也没有办法了。谢谢!
    【解决方案4】:

    我认为一般来说,一旦你打开一个套接字,你应该立即开始阅读它并且永远不要停止这样做。通过这种方式,您可以使您的服务器或客户端同时支持同步和异步协议。客户端关闭连接的那一刻,读取的那一刻就会告诉你这一点。

    【讨论】:

    • 我看不出“立即开始阅读并且永不停止这样做”与“使您的服务器或客户端同时支持同步和异步协议”之间有任何关系。能否请您为我详细解释一下?
    【解决方案5】:

    使用 error_code 可以检查客户端是否连接的条件。如果连接成功,error_code error.value() 将返回 0,否则返回其他值。您还可以从 error_code 中检查 message()。

    【讨论】:

      【解决方案6】:
      boost::asio::socket_base::keep_alive keepAlive(true);
      peerSocket->set_option(keepAlive);
      

      为对等套接字启用保持活动状态。使用本机套接字调整 keepalive 间隔,以便在连接关闭后,async_receive 处理程序将在读取时获得 EOF。

      Configuring TCP keep_alive with boost::asio

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-06
        • 2011-03-22
        • 2011-08-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多