2010-02-27 14 views
9

¿Alguien sabe qué función o archivo en linux contiene el algoritmo que encuentra un puerto aleatorio para utilizar para la llamada al sistema bind()? Estoy buscando todo y no puedo encontrar el método que contiene este algoritmo en la fuente de Linux.Kernel de Linux: ¿qué función tiene la fuente donde se eligen aleatoriamente los números de puerto?

Gracias!

+2

Me estoy perdiendo algo aquí? bind (2) es para asignar un puerto * específico *, no aleatorio, a un socket. ¿Estás hablando de puertos * efímeros *? –

+0

@Nikolai: +1 Sí, supongo que es exactamente lo que se refiere el OP. –

Respuesta

6

Es una pieza larga y complicada de código, que no estoy dispuesto a tratar de asimilar. :-)

Tenga una mirada en la función inet_csk_get_port (en net/ipv4/inet_connection_sock.c) para TCP y udp_lib_get_port (en net/ipv4/udp.c) para UDP. Es válido, al menos, para 2.6.31, aunque puede variar para diferentes versiones.

+0

Esto es exactamente lo que estoy buscando. ¡Gracias! Ahora, solo tengo que averiguar cómo llamar a bind() para obtener un puerto aleatorio y no uno específico. – Ntek

+1

@Will: Usted no escuchó esto de mí, pero si se une al puerto 0, las posibilidades son excelentes de que se tratará como un puerto libre. (Pero si puedes hacer que tu código no se vincule, incluso mejor) –

+0

Intento implementar bind (2) usando solo el código de muestra en las páginas man e intento pasar un cero al argumento uno, pero luego Obtiene el error: operación de socket en un socket. ¿Hay algún código de muestra que pueda ver para el enlace() con el puerto pasajero 0 para obtener el algoritmo de puerto aleatorio que señaló para disparar? – Ntek

Cuestiones relacionadas