python sockets ipc port

python - En localhost, ¿cómo elijo un número de puerto gratis?



subplot python (4)

Estoy tratando de jugar con la comunicación entre procesos y dado que no podía entender cómo usar named pipes en Windows, pensé que usaría sockets de red. Todo sucede localmente El servidor puede ejecutar esclavos en un proceso separado y escucha en algún puerto. Los esclavos hacen su trabajo y envían el resultado al maestro. ¿Cómo averiguo qué puerto está disponible? ¿Supongo que no puedo escuchar en el puerto 80 o 21?

Estoy usando Python, si eso reduce las opciones.

¡Gracias!


Enlaza el socket al puerto 0. Se seleccionará un puerto libre aleatorio de 1024 a 65535. Puede recuperar el puerto seleccionado con getsockname() justo después de bind() .


Por el bien de un fragmento de lo que los chicos han explicado anteriormente:

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)) return s.getsockname()[1]


Puedes escuchar en cualquier puerto que quieras; en general, las aplicaciones de usuario deben escuchar los puertos 1024 y superiores (a través de 65535). Lo principal si tiene un número variable de oyentes es asignar un rango a su aplicación, digamos 20000-21000, y EXCEPCIONES DE CAPTURA . Así es como sabrá si un puerto es inutilizable (usado en otro proceso, en otras palabras) en su computadora.

Sin embargo, en su caso, no debería tener un problema al usar un solo puerto codificado duro para su oyente, siempre y cuando imprima un mensaje de error si falla el enlace.

Tenga en cuenta también que la mayoría de sus sockets (para los esclavos) no necesitan estar vinculados explícitamente a números de puerto específicos: solo los sockets que esperan conexiones entrantes (como su maestro aquí) necesitarán ser escuchados y vinculados a un puerto. Si no se especifica un puerto para un socket antes de usarlo, el sistema operativo asignará un puerto utilizable al socket. Cuando el maestro quiere responder a un esclavo que le envía datos, la dirección del remitente es accesible cuando el oyente recibe datos.

Supongo que usará UDP para esto?


No se vincule a un puerto específico ni se vincule al puerto 0, por ejemplo, sock.bind(('''', 0)) . El sistema operativo seleccionará un puerto disponible para usted. Puede obtener el puerto que se eligió utilizando sock.getsockname()[1] y pasarlo a los esclavos para que puedan volver a conectarse.