gpt4 book ai didi

c++ - 从客户端收到所有数据后提升 asio streambuf 垃圾

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:24:09 30 4
gpt4 key购买 nike

我正在编写一个发送和接收纯文本的小型 boost asio tcp 服务器和客户端。通信或多或少是请求响应。在测试期间,我想我只是向服务器发送垃圾数​​据,向它发送 100.000 个请求。

客户端发送给服务器的消息:

\n=BEGIN 1,test\n
Hello World: 1
\n=END\n

在上面的消息中,计数器从 0 变为 99.999(在上面的示例中,它是 1,如“BEGIN 1”和“Hello World: 1”)。

如前所述,这工作正常,服务器收到了所有 100.000 条消息,但是一旦所有消息都被传输,读取处理程序将被调用多次,尽管没有从客户端发送数据。

从 streambuf 对象中读取数据会产生旧消息的残余,如:

IN 61868,test\n
Hello World: 61868
\n=END\n

和:

=END\n
=END\n

奇怪的是,它似乎只有在消息数量超过一定数量时才会发生,但它并不一致,让我相信某处发生了一些溢出或 UB,因此我显然已经做了一些事情错了,但我似乎无法弄清楚是什么。读取代码为:

 typedef boost::shared_ptr<boost::asio::streambuf>       asio_streambuf_ptr;
typedef boost::shared_ptr<boost::asio::ip::tcp::socket> asio_socket_ptr;

...

void on_read(const asio_socket_ptr& s, const asio_streambuf_ptr& b,
const boost_error_code& e, size_t length) {

if ( !e ) {

std::string temp(boost::asio::buffer_cast<const char*>(b->data()), length);
//process temp

b->consume(length);
} else {
//Handle the error - or close the socket if disconnected
handle_error(s, e);
}

read(s, b);
}

void read(const asio_socket_ptr& s, const asio_streambuf_ptr& buf) {

if (s->is_open()) {
boost::asio::async_read_until(*s, *buf, "\n=END\n",
boost::bind(on_read, s, buf, boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
}
}

我的 on_read 函数的第一个实现使用 std::istream 和 std::getline 逐行读取每条消息,但问题也存在于那里,并且由于很难在 gdb 中检查流,我重写了它以便于查看。

现在我必须强调我是 boost-asio 的新手,这是我第一次尝试用 boost 的那部分做一些有用的东西,因此我承认我很可能误解了 boost-asio 的几个概念异步io系统。

所以我的问题是:有没有人以前经历过这种情况或对我做错了什么有任何建议?

我已经制作了一个 SSCCE,但由于它涉及相当多的代码作为服务器和客户端,我想我会等到有人请求它时再将它发布到这里。

更新:问题似乎是客户端写入消息的速度比服务器读取消息的速度快。节流客户端稍微解决了这个问题。注意:更改内部缓冲区大小没有帮助,因此客户端似乎淹没了一些操作系统网络缓冲区或类似的东西。

最佳答案

如果出现错误,您不应该继续阅读 -> 只有在未检测到错误时才继续阅读。也许你在 EOF 之后继续阅读?将对 read 的调用移至 if 中的 read 函数中。

关于c++ - 从客户端收到所有数据后提升 asio streambuf 垃圾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21756194/

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