我有一个客户端,它读取文件并将数据逐行发送到服务器。服务器必须计算发送的行数。我使用boost::asio::async_read_until
来达到这个结果。但是我得到了垃圾(如下所示:行:�68�
)。客户端仅以ASCII编码发送数据。
客户端代码片段:
std::ifstream infile(argv[1]);
std::string line;
while (std::getline(infile, line)) {
boost::asio::write(s, boost::asio::buffer(line + '\n'));
std::cout << line << std::endl;
服务器读取功能:
void handle_read(const boost::system::error_code& error, size_t bytes_trasferred, boost::asio::streambuf& buf)
{
if (!error)
{
if (!bytes_trasferred)
{
std::cout << "0 bytes trasferred\n";
return;
}
std::string data = boost::asio::buffer_cast<const char*>(buf.data());
std::istringstream is(data);
std::string line;
std::getline(is, line);
std::cout << "Line: " << line << std::endl;
}
else
std::cerr << "Error: " << error.message() << std::endl;
}
void do_read()
{
std::cout << "do_read\n";
auto self(shared_from_this());
boost::asio::streambuf buf;
buf.prepare(1048576);
std::cout << "ASYNC\n";
boost::asio::async_read_until(socket_, buf, "\n",
boost::bind(&TcpConnection::handle_read, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred, boost::ref(buf)));
}
怎么解决?帮帮我,拜托!
我试着用self this来代替,这会导致内存泄漏。
我试过在句柄函数中获取数据后添加空终止符。ChatGPT告诉我这样做,但行为仍然相同。
1条答案
按热度按时间ru9i0ody1#
1.此处:
这是Undefined Behaviour,因为您假设
buf.data()
指向一个以NUL字符正确终止的字符序列,而您绝对没有理由这样假设。1.此外,你还有UB,因为你传递了一个对
buf
的引用,一个局部变量,根据定义,在do_read
返回后,它将不再有效。1.第三,正如Alan指出的,您未能将共享指针(
self
)复制到绑定处理程序中。您混合了许多不同的方法来解决处理逐行输入的问题。
streambuf
)shared_from_this
prepare()
,因为async_read_until
知道如何做到这一点(就像它为您做commit()
一样)consume()
,而不要使用getline
/again/,即使async_read_until
已经告诉你换行符在哪里。结合以下内容:
我可能会简化,避免复制和潜在的分配:
这里仍然使用动态缓冲区,但是你不需要对
istream
做额外的处理,因为你显然不需要这样做。仅仅为了说明的目的,你可以把dynamic_string_buffer
显式化:注意,我不会这样做,但它向您展示了这两种方法如何使用与
streambuf
相同的DynamicBuffer
概念。现场演示
客户端由一个非常类似的oneliner模拟:
图纸:
显示多个并发客户端的本地演示: