【问题标题】:boost::asio::ip::tcp::socket -> how to query the socket state?boost::asio::ip::tcp::socket -> 如何查询套接字状态?
【发布时间】:2023-03-19 08:25:01
【问题描述】:

我正在使用 boost 库来创建一个服务器应用程序。一次只允许一个客户端,因此如果调用 async_accept(...) 函数,则接受器将被关闭。

我的服务器的唯一工作是定期向客户端发送数据(如果在服务器上启用了发送,否则“就坐在那里”直到它被启用)。因此,我有一个提升消息队列 - 如果消息到达,则在套接字上调用 send()。

我的问题是我无法判断客户端是否仍在收听。通常你不会在意,到下一次传输时,发送会产生错误。

但在我的情况下,当打开套接字时接受器没有打开。如果套接字进入 CLOSE_WAIT 状态,我必须关闭它并再次打开接受器,以便客户端可以再次连接。

等待下一次发送也是没有选择的,因为发送可能被禁用,因此我的服务器会卡住。

问题: 如何确定 boost::asio::ip::tcp::socket 是否处于 CLOSE_WAIT 状态?

【问题讨论】:

    标签: c++ sockets boost boost-asio


    【解决方案1】:

    您可以尝试使用 ip::tcp::socket::get_option 并使用级别 SOL_SOCKET 和选项名称 SO_ERROR 获取错误状态。我很惊讶我还没有找到现成的 boost 实现。所以你可以尝试满足 GettableSocketOption 要求,使用 ip::tcp::socket::get_option 来获取套接字错误状态。

    【讨论】:

      【解决方案2】:

      这是执行 Dmitry Poroh 建议的代码:

      typedef asio::detail::socket_option::integer<ASIO_OS_DEF(SOL_SOCKET),SO_ERROR>so_error;
      so_error tmp;
      your_socket.get_option(tmp);
      int value=tmp.value();
      //do something with value.
      

      【讨论】:

        猜你喜欢
        • 2018-06-08
        • 1970-01-01
        • 1970-01-01
        • 2020-02-27
        • 1970-01-01
        • 1970-01-01
        • 2010-10-10
        • 2017-04-27
        • 1970-01-01
        相关资源
        最近更新 更多