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?