boost :: async_write导致数据损坏

时间:2013-08-22 05:17:11

标签: c++ buffer boost-asio corruption asyncsocket

我目前正在使用boost :: async_write一次发送大尺寸缓冲区(大约50KB)。结果是我在服务器端的每20个缓冲区中收到大约一个损坏的缓冲区。

我的代码是这样的。错误处理和其他细节被省略:

bool socket_available = true;
const_buffer *buffer;

// will be called frequently in a while loop in thread A
void send_buffer()
{
    scope_lock l(mutex);
    if (!socket_available) return;

    socket_available = false;
    buffer = get_buffer_for_send();   // The size is about 50KB
    boost::asio::async_write(
        socket, buffer,
        boost::bind(handle_write_request, boost::asio::placeholders::error)
    );
}

// will be called in thread B which runs io_service::run
void handle_write_request(const boost::system::error_code& error_code)
{
    scope_lock l(mutex);
    socket_available = true;
    free_buffer(buffer);
}

我相信我正确使用了async_write,因为我在调用处理程序(http://www.boost.org/doc/libs/1_54_0/doc/html/boost_asio/reference/async_write/overload1.html)后只调用了一次async_write。但是,在发送过程中数据似乎仍然是交错的。

我知道执行此类操作的常见方法是将async_write放在处理程序中,以便在一个线程中调用它们。当我这样做时,不再发生数据损坏。所以我在这里想知道为什么上面的代码不能按预期工作。

感谢您的时间和建议。顺便说一下,我在win 7下使用了boost 1.54.0。

1 个答案:

答案 0 :(得分:1)

由于您的发送是异步的,因此缓冲区必须在整个持续时间内保持不变。我无法从您的代码中说出这一点,例如,使用全局变量是不正确的。 2个发送同时会发生什么?此外,get_buffer_for_send()未显示,也可能包含问题。