gpt4 book ai didi

c++ - boost::asio::streambuf::consume - 注入(inject)垃圾字符

转载 作者:行者123 更新时间:2023-11-30 03:27:56 37 4
gpt4 key购买 nike

当我失去连接时,在我的服务器代码中,我尝试永远循环重新连接。重新连接后,我会向我连接的组件发送一条登录消息。然后该组件发回一个看起来像“MyResponse”的登录响应

初始连接工作正常。然而,在我重新连接后,我在预期的消息之前得到了垃圾,看起来像:“ýMyResponse”

谷歌搜索后。我在 Stack Overflow 上看到很多关于 boost::asio::streambuf 的问题,它用于 boost::asio 中的异步套接字。特别是关于重用缓冲区。我听从了那里的建议,并在断开连接时调用了消耗。换句话说,我调用 boost::asio::streambuf::consume 在我调用 shutdown 并关闭我的套接字之后,在 recv 上出现错误以响应对 recv_until 的调用被回调之后。

我还使用了 wireshark 来确保没有发送垃圾字符,确实没有。

经过多次调试,调用 consume 似乎是在注入(inject)一个字符,而不是清除所有字符。

这是一个最小的例子:

#include <boost/asio.hpp>

#include <iostream>
#include <sstream>
#include <string>

int main()
{
boost::asio::streambuf buffer;

std::cout << "buffer size " << buffer.size() << std::endl;

buffer.consume(std::numeric_limits<size_t>::max());

std::cout << "buffer size " << buffer.size() << std::endl;

std::istream is(&buffer);
std::string contents;
is >> contents;

std::cout << "Contents: " << contents << std::endl;

std::cout << "buffer size " << buffer.size() << std::endl;

return 0;
}

输出:

buffer size 0
buffer size 1
Contents: ²
buffer size 0

预期输出:

buffer size 0
buffer size 0
Contents:
buffer size 0

如果我不使用 consume,我会在我的服务器代码中收到一些消息,在断开连接之前,在重新连接后的第一条消息之前。

如果我确实使用 consume,我会得到一个垃圾字符。

参见:

Working with boost::asio::streambuf

Read until a string delimiter in boost::asio::streambuf

boost asio async_read: the read message adds to itself

最佳答案

boost::asio::streambuf::consume 溢出。

使用

buffer.consume(buffer.size());

而不是

buffer.consume(std::numeric_limits<size_t>::max());

报告错误以增加邮件列表。

关于c++ - boost::asio::streambuf::consume - 注入(inject)垃圾字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46980927/

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