J'ai écrit un serveur qui écoute les connexions TCP entrantes et les clients qui s'y connectent. Lorsque j'arrête le serveur et le redémarre sur le même port, il m'arrive d'obtenir le message d'erreur EADDRINUSE lors de l'appel de bind (...) (code d'erreur: 98 sous Linux). Cela se produit même si je définis l'option pour réutiliser le socket.Adresse déjà utilisée avec boost asio acceptor
L'erreur ne se produit pas tout le temps, mais il semble que cela arrive plus souvent lorsque les clients sont connectés au serveur et qu'ils envoient des données pendant l'arrêt. Je suppose que le problème est qu'il existe toujours des connexions en attente lorsque le serveur est arrêté (sujet connexe: https://stackoverflow.com/questions/41602/how-to-forcibly-close-a-socket-in-time-wait). Côté serveur, j'utilise boost :: asio :: ip :: tcp :: acceptor. Je l'initialise 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ée avec:
acceptor.close();
J'ai essayé également d'utiliser acceptor.cancel() avant, mais il avait le même effet. Lorsque cette erreur s'est produite, je ne peux pas redémarrer le serveur sur le même port pendant un certain temps. Redémarrer le réseau aide, mais n'est pas une solution permanente.
Qu'est-ce qui me manque?
Toute aide serait grandement appréciée! :)
votre serveur fork fork traite-t-il? –
également, êtes-vous sûr que le socket est dans l'état TIME_WAIT? Vous pourriez vouloir saisir la sortie 'netstat -ap' quand cela arrive. –
Sam, merci beaucoup pour votre contribution! Cela m'a aidé à trouver la solution à mon problème. Il s'est avéré que j'ai défini l'option d'adresse de réutilisation pour l'accepteur, mais pas pour toutes les autres connexions. Encore une fois, merci beaucoup pour votre aide! – Alexander