2017-03-21 1 views
0

J'ai un serveur UDP mis en place avec boost/asio (j'ai copié the example et j'ai juste changé quelques choses). Voici le code:Opération annulée boost asio async_receive_from

udp_server.hpp

using boost::asio::ip::udp; 

class udp_server { 
public: 
    udp_server(boost::asio::io_service&, int); 

private: 
    boost::array<char, 256> recBuffer; 

    udp::socket socket_; 
    udp::endpoint remote_endpoint_; 

    void start_receive(); 

    void handle_receive(const boost::system::error_code&, std::size_t); 

    void handle_send(boost::shared_ptr<std::string> /*message*/, 
     const boost::system::error_code& /*error*/, 
     std::size_t /*bytes_transferred*/) 
    {} 
}; 

et udp_server.cpp

udp_server::udp_server(boost::asio::io_service& io_service, 
         int port) 
    : socket_(io_service, udp::endpoint(udp::v4(), port)) { 
    serverNotifications.push_back("UDP Server class initialized."); 
    start_receive(); 
} 

void udp_server::start_receive() { 
    socket_.async_receive_from(
      boost::asio::buffer(recBuffer), 
      remote_endpoint_, 
      boost::bind(&udp_server::handle_receive, 
         this, 
         boost::asio::placeholders::error, 
         boost::asio::placeholders::bytes_transferred)); 
    serverNotifications.push_back("Starting to receive UDP Messages."); 

} 

void udp_server::handle_receive(const boost::system::error_code& error, 
           std::size_t size) { 
    serverNotifications.push_back("RecFrom: " + remote_endpoint_.address().to_string()); 
    if (!error) { 
     // I do data stuff here 
    } else { 
     errors.push_back("Handle Receive error: " + error.message()); 
    } 
} 

Après l'initialisation du serveur avec:

try { 
    udp_server server(io_service, ApplData.PORT, (size_t)ApplData.BUFLEN); 
} catch (std::exception& e) { 
    // error handling 
} 

et l'exécuter w ième io_service.run() dans une prise séparée d'essayer dans une autre fonction que je reçois quelques problèmes:

  • Ma fonction de rappel handle_receive est appelée sans aucun message UDP s'envoyer dans le réseau entier (aka seulement mon ordinateur portable sans connexion)
    • error.message() retours "opération annulée"
    • remote_endpoint_.address().to_string() retours "CAFK: 4000: 0: 0: 7800 ::% 2885986016" que je ne peux pas identifier comme quelque chose d'utile
  • Aussi, j'ai reconnu que mon io_service s'arrête tout le temps, mais d'après ce que je comprends, il devrait fonctionner tout le temps, n'est-ce pas?

je l'ai déjà pensé à faire référence à cette dans la liaison de la fonction de rappel avec un shared_from_this ptr, mais depuis que je suis une vraie instance de la classe udp_server jusqu'à ce que je quitte mon programme, je ne peux pas penser à une bonne raison de le faire.

Est-ce que quelqu'un peut vous expliquer si cet échec se produit, ce que ces erreurs me disent sur mon code ou ce que je peux faire pour les éviter?

Répondre

0

Nevermind, le débogage Rubberduck était suffisant. Je viens de lire la ligne

mais puisque j'ai une instance réelle de la classe udp_server jusqu'à ce que je quitte mon programme, je ne peux pas penser à une bonne raison de le faire.

et j'ai remarqué que je n'avais pas cela et que c'était l'erreur.