我一直在尝试使用 boost::asio 编写客户端-服务器应用程序,总的来说,该应用程序工作得很好,但是当连接(客户端 服务器)被防火墙或手动禁用新网络卡删除。
这是代码片段:
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 https://i.stack.imgur.com/SBiMA.png)
When 异步写入发送成功意味着它已成功写入内核缓冲区。但是,不能保证数据包已送达。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)