Pregunta

En Java puedes dar el número cero como parámetro único para el constructor Socket o DatagramSocket.Luego, Java vincula ese Socket a un puerto libre.¿Es posible limitar la búsqueda de puertos a un rango específico?

¿Fue útil?

Solución

Hrm, después de leer los documentos, no creo que puedas.Puede vincularse a cualquier puerto y luego volver a vincularse si no es aceptable, o vincularse repetidamente a un puerto en su rango hasta que tenga éxito.El segundo método será el más "eficiente".

Me inquieta esta respuesta, porque es...poco elegante, pero tampoco puedo encontrar nada más :/

Otros consejos

Vincular el socket a cualquier puerto libre es (generalmente) una característica del soporte de socket del sistema operativo;No es específico de Java.Solaris, por ejemplo, admite el ajuste del rango de puertos efímeros a través del ndd dominio.Pero sólo root puede ajustar el rango y afecta a todo el sistema, no sólo a su programa.

Si el comportamiento de enlace efímero habitual no se adapta a sus necesidades, probablemente tendrá que escribir el suyo propio utilizando Socket.bind().

Aquí está el código que necesitas:

public static Socket getListeningSocket() {
    for ( int port = MIN_PORT ; port <= MAX_PORT ; port++ )
    {
        try {
            ServerSocket s = new ServerSocket( port );
            return s;      // no exception means port was available
        } catch (IOException e) {
            // try the next port
        }
    }
    return null;   // port not found, perhaps throw exception?
}

Puede echar un vistazo al código Java que implementa la función que está utilizando.La mayoría de las bibliotecas de Java están escritas en Java, por lo que es posible que veas lo que necesitas allí.

Suponiendo que @Kenster tenía razón y es una operación del sistema, es posible que simplemente tenga que iterar sobre los puertos tratando de vincularse a cada uno o probarlo.Aunque es un poco doloroso, no deberían ser más que unas pocas líneas de código.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top