为什么 ASIO 不断返回相同的数据

Why does ASIO keep returning the same data

您好,我正在使用 SFML 和 ASIO 进行联网,用 C++ 编写在线多人游戏。我在服务器和客户端之间来回发送数据,服务器发送了正确的数据,但客户端一直表现得好像收到了相同的数据。我推断这个错误是因为 ASIO 正在缓存数据。数据是并且需要每帧来回发送。 如果我发送: {"Hello"} 作为我的第一条消息,无论在客户端只看到这个之后发送什么 要读取客户端上的数据,我使用以下代码

asio::read_until(socket, buffer, TRAILER);
str_data=asio::buffer_cast<const char*>(buffer.data());

Crystal 接球:很有可能是你的问题 您使用了 Dynamic Buffer (V1 or V2) 概念。例如。 asio::streambufasio::dynamic_string_buffer/asio::dynamic_vector_buffer,通常是通过与 asio::dynamic_buffer(m_vec_or_string).

一起使用的成员 vectorstring

动态缓冲区应该消耗。填充内容应该 .prepare()/.commit(),提取内容后你应该使用 .consume().

使用 asio::streambuf 实现所有这些的最简单方法显然是附加一个流:

 asio::streambuf buf(/*optional_max_capacity*/);
 /*size_t len = */asio::read_until(socket_, buf, "\n");

现在您可以附加流

 std::istream is(&buf);

所有常用的流操作都有效,并且会自动调用正确的缓冲区管理函数,如前所述:

std::string line;
std::getline(is, line); // calls buf.consume(len) implicitly

对于其他类型的缓冲区,您必须自己进行“数学计算”!

std::string buf;
auto        dynbuf = asio::dynamic_buffer(buf);

size_t len = asio::read_until(socket_, dynbuf, "\n");

process_data(buf.substr(0, len));
dynbuf.consume(len);

或者,更糟的是,如果您不保留动态缓冲区实例,您将不得不自己操作字符串:

std::string buf;
size_t len = asio::read_until(socket_, asio::dynamic_buffer(buf), "\n");

process_data(buf.substr(0, len));
buf = buf.substr(len);

不用说,我建议你使用你需要的最简单的缓冲区类型,然后使用最高的抽象(streambuf > 动态缓冲区 > 原始容器)来避免这些类型的错误。