web-dev-qa-db-fra.com

Sur localhost, comment choisir un numéro de port libre?

J'essaie de jouer avec la communication inter-processus et, comme je ne savais pas comment utiliser les canaux nommés sous Windows, je pensais utiliser des sockets réseau. Tout se passe localement. Le serveur peut lancer des esclaves dans un processus séparé et écoute sur un port. Les esclaves font leur travail et soumettent le résultat au maître. Comment savoir 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!

142
Anton L.

Ne 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 avec sock.getsockname()[1] et le transmettre aux esclaves afin qu'ils puissent se reconnecter.

206
mark4o

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é avec getsockname() juste après bind().

37
Havenard

Par souci d'extrait de ce que les gars ont expliqué ci-dessus:

import socket
from contextlib import closing

def find_free_port():
    with closing(socket.socket(socket.AF_INET, socket.SOCK_STREAM)) as s:
        s.bind(('', 0))
        s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        return s.getsockname()[1]
33
saaj

Vous pouvez écouter sur le port de votre choix. En règle générale, les applications utilisateur doivent écouter les ports 1024 et supérieurs (jusqu'à 65535). Si vous avez un nombre variable d'auditeurs, le principal est d'attribuer une plage à votre application, par exemple 20000-21000 et CATCH EXCEPTIONS. C'est ainsi que vous saurez si un port est inutilisable (autrement dit, utilisé par un autre processus) sur votre ordinateur.

Cependant, dans votre cas, vous ne devriez pas avoir de problème à utiliser un seul port codé en dur pour votre auditeur, 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és à des numéros de port spécifiques. Seuls les sockets qui attendent les connexions entrantes (comme votre maître ici) devront être transformés en écouteurs et liés à un port. Si aucun port n'est spécifié pour un socket avant son utilisation, le système d'exploitation affectera un port utilisable à ce 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'écouteur reçoit des données.

Je suppose que vous utiliserez UDP pour cela?

2
Walt W