2010-10-06 7 views
0

de code suivant du client:erreur de boost.asio lors de la lecture de la douille

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 
); 

du serveur:

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; 
    } 
} 

Sur le côté serveur est appelée la méthode read_header_handler(), mais la La méthode read_body_handler() n'est jamais appelée. Bien que le client a écrit les données dans une socket. L'en-tête est lu et décodé avec succès. Quelle est l'erreur?

+0

Quelle était la solution? Postez-le comme une réponse, vous pouvez répondre à votre propre question. –

Répondre

0

Le problème est résolu.

erreur était dans mon code lors de l'envoi du résultat de la sérialisation dans asio :: write(). donc le serveur ne pouvait rien lire.

Questions connexes