Estoy tratando de jugar con la comunicación entre procesos y, dado que no pude encontrar la manera de usar tuberías con nombre en Windows, pensé que usaría sockets de red. Todo sucede a nivel local. El servidor puede lanzar esclavos en un proceso separado y escucha en algún puerto. Los esclavos hacen su trabajo y presentan el resultado al maestro. ¿Cómo averiguo qué puerto está disponible? ¿Asumo que no puedo escuchar en el puerto 80 o 21?
Estoy usando Python, si eso reduce las opciones.
¡Gracias!
Respuestas:
No se una a un puerto específico, ni a un puerto 0, por ejemplo
sock.bind(('', 0))
. El sistema operativo elegirá un puerto disponible para usted. Puede obtener el puerto elegido utilizandosock.getsockname()[1]
y pasarlo a los esclavos para que puedan conectarse de nuevo.fuente
sock.bind(('',0))
En aras de un fragmento de lo que los chicos han explicado anteriormente:
fuente
s.bind(('localhost', 0))
es mejors.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
socket.SO_REUSEADDR
Realmente ayuda en este caso? Por lo que leí, solo es relevante que el zócalo que está tratando de vincularse tengaSO_REUSEADDR
y es irrelevante si ese indicador está configurado en el zócalo persistente.Enlace el zócalo al puerto 0. Se seleccionará un puerto libre aleatorio de 1024 a 65535. Puede recuperar el puerto seleccionado
getsockname()
inmediatamente despuésbind()
.fuente
Puede escuchar en cualquier puerto que desee; en general, las aplicaciones de usuario deben escuchar los puertos 1024 y superiores (hasta 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 CAPTURAS . Así es como sabrá si un puerto no se puede usar (utilizado por otro proceso, en otras palabras) en su computadora.
Sin embargo, en su caso, no debería tener problemas al usar un solo puerto codificado para su escucha, siempre que 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í) deberán hacerse escuchar y vincularse 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ás UDP para esto?
fuente
Si solo necesita encontrar un puerto libre para su uso posterior, aquí hay un fragmento similar a una respuesta anterior , pero más corto, usando el servidor de sockets :
Tenga en cuenta que no se garantiza que el puerto permanezca libre, por lo que es posible que deba colocar este fragmento y el código que lo usa en un bucle.
fuente