代码之家  ›  专栏  ›  技术社区  ›  niXman

从插座读取时出现boost.asio错误

  •  0
  • niXman  · 技术社区  · 14 年前

    客户的以下代码:

      typedef boost::array<char, 10> header_packet;
      header_packet header;
      boost::system::error_code error;
      ...
      /** send header */
      boost::asio::write(
         _socket,
         boost::asio::buffer(header, header.size()),
         boost::asio::transfer_all(),
         error
      );
      /** send body */
      boost::asio::write(
         _socket,
         boost::asio::buffer(buffer, buffer.length()),
         boost::asio::transfer_all(),
         error
      );
    

    服务器:

       struct header {
          boost::uint32_t header_length;
          boost::uint32_t id;
          boost::uint32_t body_length;
       };
       static header unpack_header(const header_packet& data) {
          header hdr;
          sscanf(data.data(), "%02d%04d%04d", &hdr.header_length, &hdr.id, &hdr.body_length);
          return hdr;
       }
    
    void connection::start() {
       boost::asio::async_read(
          _socket,
          boost::asio::buffer(_header, _header.size()),
          boost::bind(
             &connection::read_header_handler,
             shared_from_this(),
             boost::asio::placeholders::error
          )
       );
    }
    
    /***************************************************************************/
    
    void connection::read_header_handler(const boost::system::error_code& e) {
       if ( !e ) {
          std::cout << "readed header: " << _header.c_array() << std::endl;
          std::cout << constants::unpack_header(_header);
          boost::asio::async_read(
             _socket,
             boost::asio::buffer(_body, constants::unpack_header(_header).body_length),
             boost::bind(
                &connection::read_body_handler,
                shared_from_this(),
                boost::asio::placeholders::error
             )
          );
       } else {
          /** report error */
          std::cout << "read header finished with error: " << e.message() << std::endl;
       }
    }
    
    /***************************************************************************/
    
    void connection::read_body_handler(const boost::system::error_code& e) {
       if ( !e ) {
          std::cout << "readed body: " << _body.c_array() << std::endl;
          start();
       } else {
          /** report error */
          std::cout << "read body finished with error: " << e.message() << std::endl;
       }
    }
    

    在服务器端调用方法read_header_handler(),但从未调用方法read_body_handler()。尽管客户机已经在一个套接字中写下了数据。 头已成功读取和解码。 错误是什么?

    1 回复  |  直到 11 年前
        1
  •  0
  •   niXman    14 年前

    问题解决了。

    在asio::write()中发送序列化结果时,代码中有错误。所以服务器无法读取任何内容。