首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Continuous boost::asio读取

Continuous boost::asio读取
EN

Stack Overflow用户
提问于 2010-10-29 09:06:59
回答 2查看 1.3K关注 0票数 2

我正在尝试使用Boost::asio,并且我正在尝试制作一个客户端,该客户端可以读取从服务器发送的数据包并将其输出到控制台。服务器使用专有协议。它每秒发送一个计时器更新,响应ping,并可以在客户端请求时回复文件列表。我已经很好地掌握了异步网络,但是我遇到了一个问题。代码如下:

代码语言:javascript
复制
class JReader
{
public:
  JReader(boost::asio::io_service &io_s)
    : socket_(io_s)
  {
    tcp::resolver resolver(io_s);
    tcp::resolver::query query("xxxx", "yyyy");
    tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);
    tcp::resolver::iterator end;

    boost::system::error_code error = boost::asio::error::host_not_found;
    while (error && endpoint_iterator != end)
    {
      socket_.close();
      socket_.connect(*endpoint_iterator++, error);
    }
    if (error)
    {     
      throw boost::system::system_error(error);
    }


    boost::asio::async_write(socket_, boost::asio::buffer(connect, 12), boost::bind(&JReader::handle_write, this));
    boost::asio::async_write(socket_, boost::asio::buffer(getlist, 3), boost::bind(&JReader::handle_write, this));

    boost::asio::async_read(socket_, boost::asio::buffer(buf_, BUF_SIZE), boost::bind(&JReader::handle_read, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));
  }
private:

  void handle_read(const boost::system::error_code err, size_t bytes)
  {        
    std::cout<<std::endl<<std::string(buf_, bytes);
    boost::asio::async_read(socket_, boost::asio::buffer(buf_, BUF_SIZE), boost::bind(&JReader::handle_read, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));
  }

  void handle_write()
  {
    //TODO: finish this!
    std::cout<<std::endl<<"Wrote something";

  }

  static const int BUF_SIZE = 256;
  char buf_[BUF_SIZE];
  tcp::socket socket_;
};

该程序从服务器读取数据并将数据输出到控制台--但主板发出可怕的蜂鸣声。我很确定这和我的handle_read循环有关。

持续监听服务器的正确、无阻塞方式是什么?

EN

回答 2

Stack Overflow用户

发布于 2010-10-29 12:36:05

啊哈!我使用asio是正确的,但我的错误是将二进制数据传输到std::cout!!我使用的是文件流,现在它可以工作了。:)

票数 4
EN

Stack Overflow用户

发布于 2010-10-30 00:46:28

您没有正确使用async_write,同时发布两个异步写入是一个应用程序错误。在async_writedocumentation中对此进行了描述

此操作是通过零个或多个对流的async_write_some函数的调用来实现的,称为组合操作。程序必须确保在此操作完成之前,流不执行任何其他写入操作(如async_write、流的async_write_some函数或执行写入的任何其他组合操作)。

您很可能观察到了正确的行为,因为您发送的数据非常短(分别为12字节和3字节)。我建议在调用第一个处理程序之后发布第二个async_write

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4048288

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档