Address already in use avec boost asio accepteur

J'ai écrit un serveur qui est à l'écoute pour incomming les connexions TCP et les clients à se connecter à elle. Quand j'ai arrêté le serveur et de le redémarrer sur le même port, j'ai parfois le message d'erreur EADDRINUSE lors de l'appel de bind(...) (code d'erreur: 98 sur Linux). Cela se produit même si je suis à la définition de l'option de réutiliser le support.

L'erreur ne se produit pas tout le temps, mais il semble qu'il se produit le plus souvent lorsque les clients sont connectés au serveur et l'envoi de données alors qu'il s'arrête. Je crois que le problème c'est qu'il y a encore des connexions en attente pendant que le serveur est arrêté (rubrique connexe: https://stackoverflow.com/questions/41602/how-to-forcibly-close-a-socket-in-time-wait).

Sur le côté serveur, j'utilise boost::asio::ip::tcp::accepteur. Je l'initialiser avec l'option "reuse_address" (voir http://beta.boost.org/doc/libs/1_38_0/doc/html/boost_asio/reference/basic_socket_acceptor.html). Voici l'extrait de code:

using boost::asio::ip::tcp;
acceptor acceptor::acceptor(io_service);
endpoint ep(ip::tcp::v4(), port);
acceptor.open(ep.protocol());
acceptor.set_option(acceptor::reuse_address(true));
acceptor.bind(ep);
acceptor.listen();

L'accepteur est fermé par:

acceptor.close();

J'ai aussi essayé d'utiliser accepteur.annuler() avant, mais il a eu le même effet. Lorsque cette erreur s'est produite, je ne peux pas redémarrer le serveur sur le même port, pour un certain temps. Le redémarrage du réseau d'aide, mais n'est pas une solution permanente.

Ce qui me manque?

Toute aide serait grandement appréciée! 🙂

est-ce que votre serveur fourche processus enfants?
aussi, êtes-vous sûr que le socket est en état TIME_WAIT? Vous pourriez vouloir prendre le netstat -ap de sortie lorsque cela se produit.
Sam, je vous remercie beaucoup pour votre participation! Il m'a aidé à trouver la solution à mon problème. Il s'est avéré que je n'ai mis la réutilisation option d'adresse de l'accepteur, mais pas pour toutes les autres connexions. Encore une fois, merci beaucoup pour votre aide!
J'ai ajouté mes commentaires comme une réponse.

OriginalL'auteur Alexander | 2010-11-16

Leave a Reply

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *