为什么 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::streambuf
或 asio::dynamic_string_buffer
/asio::dynamic_vector_buffer
,通常是通过与 asio::dynamic_buffer(m_vec_or_string)
.
一起使用的成员 vector
或 string
动态缓冲区应该消耗。填充内容应该 .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 > 动态缓冲区 > 原始容器)来避免这些类型的错误。
您好,我正在使用 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::streambuf
或 asio::dynamic_string_buffer
/asio::dynamic_vector_buffer
,通常是通过与 asio::dynamic_buffer(m_vec_or_string)
.
vector
或 string
动态缓冲区应该消耗。填充内容应该 .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 > 动态缓冲区 > 原始容器)来避免这些类型的错误。