【问题标题】:Boost Asio not properly readingBoost Asio 无法正确读取
【发布时间】:2017-03-30 23:34:38
【问题描述】:

在我的代码中,我同时设置了客户端和服务器套接字,以使用 asio 模拟两者之间的交互。不幸的是,我的 read() 出现了一些问题,我不完全确定我没有正确传递什么以及为什么。当我运行它时,它会无限期地等待。可能是我缺少的东西?

boost::asio::io_service ioservice;
tcp::acceptor acceptor(ioservice);
tcp::socket client(ioservice);
tcp::socket server(ioservice);

boost::asio::ip::tcp::endpoint endpoint(boost::asio::ip::address::from_string("127.0.0.1"), 2222);

acceptor.open(endpoint.protocol());
acceptor.bind(endpoint);
acceptor.listen();
acceptor.async_accept(server, &acc_handle);

client.async_connect(endpoint, &conn_handle);

ioservice.run();

boost::asio::write(client, boost::asio::buffer("test"));

boost::asio::streambuf bfr;
boost::asio::read(client, bfr);

编辑:添加了处理程序,它们只是记录信息,所以我省略了它们的定义。

【问题讨论】:

  • 这不是真正的代码。 async_connect 等需要处理程序。
  • 您正在写入客户端套接字,但没有从服务器套接字读取(这是您打算“测试”出现的地方)。没有你在哪里写过任何东西到服务器套接字,所以没有任何东西可以从客户端套接字读取。
  • @bazza 这就是网络服务通常的工作方式,但对方通常不是同一个程序。
  • @bazza 如果我尝试从服务器套接字读取,问题是我会得到一个“错误的文件描述符”错误,这让我相信我不能直接使用它。跨度>

标签: c++ sockets boost asio


【解决方案1】:

如果这是真正的代码流,那么在ioservice.run(); 之后不会执行任何操作,直到您停止它,此时也不会执行任何ioservice 操作。代码需要驻留在这些异步处理程序中。

由于您没有包含处理程序的定义,因此很难掌握正在发生的事情,但我会尝试进行预测:

acc_handle 应该包含一个server.async_receive(read_buffer, [](const boost::system::error_code&, size_t){...});

conn_handle 应该包含一个client.async_send(write_buffer, endpoint, [](const boost::system::error_code&, size_t){...});,此时您应该能够看到服务器的接收处理程序正在触发。

话虽如此,我强烈建议您阅读http://www.boost.org/doc/libs/1_64_0/doc/html/boost_asio/examples/cpp11_examples.html 上的相关示例,因为它们写得清晰干净。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多