2013-08-22 65 views
3

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

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

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正确的,因为我只叫ASYNC_WRITE一次调用处理程序(http://www.boost.org/doc/libs/1_54_0/doc/html/boost_asio/reference/async_write/overload1.html)之后。然而,数据在发送过程中似乎仍然是交织的。

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

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

+0

套接字同步看起来很好,并在我编写的模拟示例程序中正常工作。还有不少未知数(socket协议,其他线程中的套接字使用情况,实际缓冲区);但是,如果您提供[sscce](http://sscce.org/),我们可能能够更好地为您提供帮助。 –

回答

1

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