À l'aide de boost::asio::ip::tcp::socket::annuler() et socket::close()
Si j'utilise la fermer et de ne pas annuler, il y a quelques problèmes.
La close
fonction peut fermer le socket, et le solde des opérations asynchrones est arrêté par le retour boost::asio::error::operation_aborted
erreur.
Pourquoi devrais-je utiliser cancel
au lieu de close
?
- Je m'inquiéter si certaines opérations asynchrones est en cours d'exécution, le cancel
ne pouvait pas l'annuler, oui?
Comme asio::ip::tcp::resolve::cancel
, j'ai essayer plusieurs fois pour annuler la resolve_handler
après l'appel de async_resolve
, mais resolve_handler
retourne toujours avec pas de boost::asio::error::operation_aborted
erreur.
Je pense que resolve_handler
est en cours d'exécution?
Oui?
Vous devez vous connecter pour publier un commentaire.
Annuler est utile si vous voulez arrêter les opérations en cours, sans fermeture de la socket.
Noter que le Stimuler la documentation recommande l'utilisation de fermer pour une plus grande portabilité (à partir de la page de doc):
cancel
de ne pas fermer le socket, donc à utilisercancel
si vous avez l'intention de continuer à utiliser le support de l'objet. En particulier, si vous disposez d'un code asynchrone méthodes de gestionnaire qui fait référence à la prise de fonctions de membre, vous ne voulez pas fermer le socket jusqu'à ce que vous êtes certain que votre actuellement en cours d'exécution asynchrone des gestionnaires d'avoir terminé.cancel
ne garantit rien sur cours d'exécution asynchrone des gestionnaires, il garantit seulement (par la poussée de la documentation), que "Cette fonction provoque l'encours asynchrone connecter, envoyer et recevoir des opérations pour terminer immédiatement" dans le cas de lasocket::cancel()
appel, ou "Cette fonction les forces de l'achèvement de toutes les opérations asynchrones en attente sur l'ordinateur hôte résolution" dans le cas de laresolver::cancel()
appel. Cette "achèvement" signifie que boost appelle votre gestionnaire asynchrone de la méthode, il n'a pas compétence pour injecter toute annulation logique dans votre gestionnaire asynchrone (sans oublier qu'il ne connaît pas le gestionnaire de mise en œuvre pour commencer).Je suggère l'ajout de votre propre logique dans votre gestionnaire asynchrone de la méthode pour gérer le cas où le support/résolveur/etc. est annulé. Si vous appelez la méthode cancel, alors vous avez probablement avoir la capacité de communiquer de cette annulation, le gestionnaire asynchrone de la méthode.