Moyen rapide de tester si un port est en cours d'utilisation à l'aide de Python
J'ai un python serveur qui écoute sur un couple de sockets. Au démarrage, j'essaie de connecter ces prises avant d'écouter, de sorte que je peux être sûr que rien d'autre n'utilise déjà ce port. Ce qui ajoute environ trois secondes pour mon démarrage du serveur (qui est d'environ .54 secondes sans le test), et j'aimerais les couper vers le bas. Depuis que je suis seul test localhost, je pense qu'un délai d'attente d'environ 50 millisecondes est plus que suffisant pour que. Malheureusement, le socket.setdefaulttimeout(50) méthode ne semble pas fonctionner pour une raison quelconque.
Comment je peux garniture cela?
OriginalL'auteur directedition | 2010-03-18
Vous devez vous connecter pour publier un commentaire.
Que diriez-vous simplement essayer de se lier au port que vous voulez, et gérer les cas d'erreur si le port est occupé?
(Si le problème est que vous pourriez commencer le même service deux fois, puis ne pas chercher à ouvrir des ports.)
Cela est-il raisonnable de façon à éviter de provoquer une course à condition, comme @eemz dit dans une autre réponse.
Peut-être qu'il ne renvoie pas d'erreur jusqu'à ce que vous essayez d'écouter()
OriginalL'auteur Simon B.
Voici un exemple de la façon de vérifier si le port est pris.
1. où le port d'impression est disponible? 2.ne peut-on pas de port de être appliqué plusieurs fois en utilisant la même adresse ou diffrent addr?Comme SO_REUSEADDR par exemple?
OriginalL'auteur Stian OK
Pour vérifier l'utilisation des ports:
source: https://codereview.stackexchange.com/questions/116450/find-available-ports-on-localhost
Désolé, j'étais en fait à l'aide de Python 2.7.13. Votre exemple fonctionne avec Python 3.7.0. Va supprimer mon commentaire précédent.
OriginalL'auteur Rugnar
Vous êtes sur Linux? Si oui, peut-être que votre application peut exécuter
netstat -lant
(ounetstat -lanu
si vous êtes en utilisant UDP) et de voir quels sont les ports en cours d'utilisation. Cela devrait être plus rapide...netstat
semble fonctionner très bien sur Vista pour faire la même chose.OriginalL'auteur Mox
Simon B, la réponse est la voie à suivre - ne pas vérifier quoi que ce soit, essayez juste de lier et de gérer les cas d'erreur si il est déjà en cours d'utilisation.
Sinon, vous êtes dans une situation de concurrence où d'autres applications peuvent saisir le port entre votre vérifier que c'est gratuit et votre tentative de se lier à elle. Cela signifie que vous devez toujours gérer la possibilité que votre appel à bind va échouer, afin de vérifier à l'avance abouti à rien.
OriginalL'auteur eemz
Ici est une mise en œuvre de Mox réponse qui fonctionne pour moi:
OriginalL'auteur AvielNiego