使用asio + ssl时,async_write不发送数据

时间:2017-06-07 19:58:45

标签: c++ network-programming boost-asio

假设:

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 个答案:

答案 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);