【问题标题】:WriteHandler from boost::asio::async_write doesn't work properly when connection is dropped (firewall / manual disconecting the network)当连接断开时,来自 boost::asio::async_write 的 WriteHandler 无法正常工作(防火墙/手动断开网络连接)
【发布时间】:2026-01-04 23:10:01
【问题描述】:

我一直在尝试使用 boost::asio 编写客户端-服务器应用程序,总体而言,该应用程序运行良好,但我偶然发现了一个问题,即当 connoction (在客户端 服务器之间)被防火墙丢弃或通过手动禁用新网络卡。

这里是sn-p的代码:

void write(const CommunicatorMessage & msg, std::function<void(bool)> writeCallback)
        {
            io_service.dispatch(
                [this, msg, writeCallback]()
            {
                boost::asio::async_write(socket, boost::asio::buffer(msg.data(), msg.length()), [this, msg, writeCallback](boost::system::error_code ec, std::size_t length)
                {
                    writeCallback(ec != 0);
                    if (!ec)
                    {
                        LOG_DEBUG("Number of bytes written into the buffer: " << length << " Error code: " << ec);
                        LOG_DEBUG("Successfully send msg: " << msg);
                    }
                    else
                    {
                        LOG_ERROR("Failed sending msg: " << msg);
                        throw std::exception(ec.message().c_str());
                    }
                });
            });
        }

来自 Writehandler 的数据是有效的(错误代码为 0,bytes_transferred 是正确的),即使数据没有到达服务器。我已经用 Wireshark 跟踪了整个流程(这里有一个截图链接Link

【问题讨论】:

标签: c++ boost handler boost-asio


【解决方案1】:

async_write 向您发送成功时,这意味着它已成功写入内核缓冲区。但是,它不能保证数据包已送达。

【讨论】:

  • 酷,感谢您的澄清。我需要发送大量数据包并且我需要一个订单,有没有办法在我发送下一个之前检查服务器是否收到了一个包......等等?提前致谢。
  • @lerys 你的数据包将按照你发送的顺序发送和接收,因为它的 TCP 流。但是,在重传超时发生之前,您无法知道数据包已丢失。在这种情况下,您的读/写处理程序将使用boost::asio::error::eofboost::asio::error::broken_pipe 错误代码调用。
最近更新 更多