gpt4 book ai didi

c++ - boost::async_write 导致数据损坏

转载 作者:太空狗 更新时间:2023-10-29 23:05:39 27 4
gpt4 key购买 nike

我目前正在使用 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。

最佳答案

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

关于c++ - boost::async_write 导致数据损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18372164/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com