2011-12-01 12 views
5

Lo que me gustaría lograr¿cuál puerto efímero tiene java InetSocketAddress vinculado?

unen un servidor a un puerto efímero para propósitos de prueba unidad.

Mi problema:

Usando el JDK 1.5.0_22 trato de enlazar un InetSocketAddress en un puerto efímero mediante el puerto 0 según el javadoc pero no puedo encontrar un camino desde el objeto de dirección saber qué puerto se ha binded a, por lo que no puede haber configurado mis clientes en consecuencia:

InetSocketAddress address = new InetSocketAddress(0); 
assertThat(address.isUnresolved(), is(false)); 
assertThat(address.getPort(), is(0)); 

que no pueden entender correctamente la sentencia javadoc:

Un valor de puerto válido está entre 0 y 65535. Un número de puerto cero permite que el sistema recoja un puerto efímero en una operación de vinculación.

Pero la comprobación del puerto, incluso después de tener mi servidor de escuchar a la toma no devuelve nada más que 0 (la siguiente utiliza la biblioteca http://simpleweb.sourceforge.net/) (estoy asumiendo que había sucedido a continuación, la unión):

Container httpServer = new Container() { 

     public void handle(Request req, Response resp) { 
     } 
    }; 
    SocketConnection connection = new SocketConnection(httpServer); 
    InetSocketAddress address = new InetSocketAddress(0); 
    connection.connect(address); 

    assertThat(address.isUnresolved(), is(false)); 
    assertThat(address.getPort(), is(0)); 

Uso de nmap Ni siquiera veo un puerto encuadernado, así que supongo que mi comprensión es incorrecta. ¿Alguna ayuda?

+1

nmap funciona desde el "exterior" y está sujeto a firewalls y otras cosas. Para verificar enlaces de puertos en la misma máquina, use "netstat" en su lugar, que consultará directamente la pila TCP, en lugar de buscar y pinchar. –

Respuesta

10

El InetSocketAddress que inicialmente contiene el puerto 0 no se actualiza por connect() para representar el puerto real al que estaba destinado. Llame al connection.getLocalPort() o ((InetSocketAddress)connection.getLocalSocketAddress()).getPort() en su lugar para obtener el puerto encuadernado.

Cuestiones relacionadas