繁体   English   中英

boost :: asio :: read函数挂起

[英]boost::asio::read function hanging

如果有人可以帮助我,我将无法理解boost :: asio :: read函数在boost asio中的工作方式。 在boost的示例中,他们让它在接收消息之前声明缓冲区大小,这没有任何意义(在读取消息之前,我如何知道要读取多少字节?)

我尝试了这段代码,但是它挂了

  boost::asio::io_service io_service;

  tcp::resolver resolver(io_service);
  tcp::resolver::query query(tcp::v4(), "localhost", "3000");
  tcp::resolver::iterator iterator = resolver.resolve(query);

  tcp::socket sock(io_service);
  boost::asio::connect(sock, iterator);
  cout << "read start" << endl;
  boost::system::error_code err_code;

  // Read from client.
  boost::asio::streambuf read_buffer;
  int bytes_transferred = boost::asio::read(sock, read_buffer, err_code);
  std::cout << "Read: " << make_string(read_buffer) << std::endl;
  read_buffer.consume(bytes_transferred); // Remove data that was read.

通常,您知道要从协议的定义中读取多少字节。

在相反的情况下,您必须一一读取字节,并观察错误代码以在连接,文件等结尾处停止。

Boost.Asio中的同步方法(例如read )是简短示例的好方法,但是在实际使用情况下,您应该首选异步版本async_read ,它允许您取消或仅等待下一个数据块而不会阻塞程序。

我遇到了同样的问题。 似乎boost :: asio :: read应该挂在那里,直到关闭所连接的客户端为止。 相反,您可以这样使用socket.read_some

using boost::asio::ip::tcp;
try {
    boost::asio::io_service io_service;

    tcp::acceptor acceptor(io_service, tcp::endpoint(tcp::v4(), 9999));

    for (;;) {
        tcp::socket socket(io_service);
        acceptor.accept(socket);

        std::string message = "server received!\n";

        boost::system::error_code error_code;
        boost::asio::streambuf stream_buf;

        std::vector<char> buf(1024);
        size_t len = socket.read_some(boost::asio::buffer(buf), error_code);
        std::string received_filename(buf.begin(), buf.end());
        received_filename.resize(len);
        if (error_code) {
            std::cout << "error status: " << error_code.message() << std::endl;
        }

        boost::asio::write(socket, boost::asio::buffer(message), error_code);
        if (error_code) {
            std::cout << "error status: " << error_code.message() << std::endl;
        }
        query_database(tree, received_filename, output_folder, db_image_filenames);
    }
}
catch (std::exception& e) {
    std::cerr << e.what() << std::endl;
}

这将立即从客户端获得一条消息,并带有一条相对简短的消息。 希望能有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM