假设:
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中的一个错误,还是我的程序中的一些棘手的错误以及在哪里修复它。
我可以轻松地重现案例,可以提供日志文件等。
答案 0 :(得分:0)
如果您在MMA中看到时间戳晚于2.但这并不意味着它在2之后发送。(取决于协议中您看到时间戳的位置)。这可能仅仅意味着MMA稍后会看到它。此外,像Nagle的算法这样的东西可以发挥作用。
尝试设置TCP NODELAY,例如
socket.open(tcp::v4());
socket.set_option(tcp::no_delay(true));
socket.async_connect(endpoint, handler);