J'essaie de jouer avec la communication inter-processus et comme je ne pouvais pas comprendre comment utiliser des tuyaux nommés sous Windows, j'ai pensé que j'utiliserais des sockets réseau. Tout se passe localement. Le serveur est capable de lancer des esclaves dans un processus séparé et écoute sur certains ports. Les esclaves font leur travail et soumettent le résultat au maître. Comment déterminer quel port est disponible? Je suppose que je ne peux pas écouter sur le port 80 ou 21?
J'utilise Python, si cela réduit les choix.
Merci!
Réponses:
Ne vous liez pas à un port spécifique, ni au port 0, par exemple
sock.bind(('', 0))
. Le système d'exploitation choisira alors un port disponible pour vous. Vous pouvez obtenir le port choisi en utilisantsock.getsockname()[1]
et le transmettre aux esclaves afin qu'ils puissent se reconnecter.la source
sock.bind(('',0))
Par souci d'extrait de ce que les gars ont expliqué ci-dessus:
la source
s.bind(('localhost', 0))
- être mieuxs.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
socket.SO_REUSEADDR
vraiment utile dans ce cas? D'après ce que j'ai lu, il est seulement pertinent que le socket qui essaie de se lier aSO_REUSEADDR
et peu importe si cet indicateur est défini sur le socket persistant.Liez le socket au port 0. Un port libre aléatoire de 1024 à 65535 sera sélectionné. Vous pouvez récupérer le port sélectionné
getsockname()
juste aprèsbind()
.la source
Vous pouvez écouter sur le port de votre choix; généralement, les applications utilisateur doivent écouter les ports 1024 et plus (via 65535). L'essentiel si vous avez un nombre variable d'écouteurs est d'allouer une plage à votre application - disons 20000-21000, et CATCH EXCEPTIONS . C'est ainsi que vous saurez si un port est inutilisable (utilisé par un autre processus, en d'autres termes) sur votre ordinateur.
Cependant, dans votre cas, vous ne devriez pas avoir de problème en utilisant un seul port codé en dur pour votre écouteur, tant que vous imprimez un message d'erreur si la liaison échoue.
Notez également que la plupart de vos sockets (pour les esclaves) n'ont pas besoin d'être explicitement liées à des numéros de port spécifiques - seules les sockets qui attendent des connexions entrantes (comme votre maître ici) devront être un écouteur et liés à un port. Si un port n'est pas spécifié pour un socket avant son utilisation, le système d'exploitation attribuera un port utilisable au socket. Lorsque le maître veut répondre à un esclave qui lui envoie des données, l'adresse de l'expéditeur est accessible lorsque l'auditeur reçoit des données.
Je suppose que vous utiliserez UDP pour cela?
la source
Si vous avez seulement besoin de trouver un port libre pour une utilisation ultérieure, voici un extrait de code similaire à une réponse précédente , mais plus court, en utilisant socketserver :
Notez que le port n'est pas garanti pour rester libre, vous devrez donc peut-être placer cet extrait et le code qui l'utilise dans une boucle.
la source