持续提升:: asio读取

时间:2010-10-29 01:06:59

标签: boost boost-asio

我正在尝试使用Boost :: asio,我正在尝试创建一个客户端来读取和输出从服务器发送的控制台数据包。服务器使用专有的protolcol。它每秒发送一次定时器更新,响应ping,并在客户端请求时回复文件列表。我对异步网络有很好的把握,但我有一个 问题。这是代码:

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循环有关。

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

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:2)

您没有正确使用async_write,同时发布两个异步写入是一个应用程序错误。 documentation async_write

中对此进行了描述
  

此操作以术语实施   对流的零次或多次调用   async_write_some函数,是   称为组合操作。的的   程序必须确保流   不执行任何其他写操作   (例如async_write,流的   async_write_some函数,或任何   执行的其他组合操作   写道)直到这个操作   完成。

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