2011-12-22 19 views
13

Duplicar posible:
On localhost, how to pick a free port number?¿Cómo elegir un número de puerto gratis en python?

Mi requisito es diferente a esta pregunta.

On localhost, how to pick a free port number?

estoy escribiendo una configuración de prueba de otro proceso usando pitón. El otro proceso necesita un número de puerto para pasar (digamos como un parámetro de línea de comando). No puedo codificar un número de puerto aleatorio porque muchos usuarios suelen ejecutar la misma prueba en la misma casilla. Ahora, ¿cómo selecciono un puerto libre en Python?

Editar:

No estoy creando una toma de pitón. Solo necesito pasar un número a algún otro proceso como un argumento de línea de comando.

De la respuesta de DRH, Podría crear un socket ficticio, obtener su número de puerto, cerrarlo y pasar al proceso real. ¿Hay alguna forma mejor de hacer esto?

+4

¿De qué manera es diferente su requerimiento? – wim

+1

No estoy creando un socket en python. Entonces, ¿cómo le pido al sistema operativo que me dé un puerto libre? Solo necesito pasar ese número a algún otro proceso como un argumento de línea de comando. – balki

+0

No estoy seguro de pedirle al sistema operativo un número de puerto gratuito. ¿Qué pasa si lo preguntas varias veces sin abrir los enchufes? ¿Se garantiza que obtendrá diferentes números de puerto en cada solicitud? – jcollado

Respuesta

12

Es probable que no haya una manera segura de hacer lo que está pidiendo. Incluso si el sistema operativo puede devolverle un puerto que actualmente es gratuito, no hay garantía de que otro proceso no vincule un socket a ese puerto entre el momento en que solicita el puerto y cuando la aplicación que invoca intenta vincularse a él.

Dado que, si solo busca un puerto que probablemente sea libre, puede enlazar al puerto 0 como se describe aquí On localhost, how to pick a free port number?, cerrar el socket resultante (liberando el puerto) y luego pasar ese valor a su aplicación .

+0

Creo que otro proceso para obtener ese puerto mientras tanto sería raro. Así que iría con eso. De todos modos, esperaba una mejor manera de preguntarle al sistema operativo en lugar de crear un socket falso y cerrarlo. – balki

+7

Para el registro, aquí está la implementación de esa sugerencia: https://gist.github.com/3979133 –

Cuestiones relacionadas