我目前正在使用 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 因为我只在调用处理程序后调用 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。