【发布时间】:2017-06-07 19:58:44
【问题描述】:
给定:
asio::ssl::stream<asio::ip::tcp::socket&> &m_socket;
async_write(self->m_socket, asio::buffer(self->m_v),
[self, handler](asio::error_code ec, std::size_t s)
{
handler(ec);
});
结果:
在发送数据之前调用处理程序(调用 socket.send() 函数)。
结果 2:
数据实际上是在很长一段时间后发送的 - 在我的可重现情况下大约 1 分钟。
因此,事件的顺序如下:
1、async_write被调用;
2. 处理程序被调用;
3. 发送数据。
我认为正确的顺序必须是:
1.async_write被调用;
2.数据发送。
3. 处理程序被调用;
它并不总是发生,但非常可重复。我在整个互联网上搜索了类似的案例 - 一无所获。
我需要建议:该怎么做。它是 asio 中的错误还是我的程序中的一些棘手错误以及在哪里寻找修复它。
我可以轻松重现案例,可以提供日志文件等。
【问题讨论】:
-
你怎么知道订单是
1. 2. 3.而不是1. 3. 2.?您的意思是您测量“3. 数据已接收”而不是“3. 数据已发送”? -
1.我在日志消息中添加了时间戳。我在 async_write 之前和其处理程序的开头打印一条日志消息。我根据这些时间戳确定 1 在 2 之前。至于 3,我使用了 Microsoft Message Analyzer 来捕获网络流量。消息分析器捕获还包含时间戳。我相信这些时间戳标记了消息从 asio 代码进入网络系统的时刻。因此,我确定顺序是 1. 2. 3. 2. 当我写“3.发送数据”时,我的意思是发送了数据。
-
如果您在 MMA 中看到的时间戳晚于 2.,这并不意味着它是在 2. 之后发送的(取决于您在协议中看到时间戳的位置)。这可能只是意味着 MMA 稍后看到了它。此外,像 Nagle 的算法之类的东西也可能在起作用。
标签: c++ network-programming boost-asio