2011-02-18 10 views
6

Al utilizar Netty, me sorprendió que si la opción reuseAddress yo uso, que permite una ServerSocket de obligar a la misma dirección sin levantar una "excepción ya atar"ServerSocket reuseAddress permite enlazar a un puerto ya enlazado?

 ServerBootstrap bootstrap = new ServerBootstrap(
       new NioServerSocketChannelFactory(Executors 
         .newCachedThreadPool(), Executors.newCachedThreadPool())); 
     bootstrap.setPipelineFactory(new ChannelPipelineFactory() { 
      @Override 
      public ChannelPipeline getPipeline() throws Exception { 
       ChannelPipeline p = pipeline(); 
       p.addLast("handler", new DummyHandler()); 
       return p; 
      } 
     }); 
     bootstrap.setOption("reuseAddress", true); 
     bootstrap.bind(new InetSocketAddress(2000)); 
     bootstrap.bind(new InetSocketAddress(2000)); 

Sólo pensé que reuseAddress permite un nuevo socket reutilizar un socket de espera cerrada, pero esto es diferente. El siguiente es el resultado de un comando netstat

C:\Users\secmask>netstat -a -n|grep 2000 
    TCP 0.0.0.0:2000   0.0.0.0:0    LISTENING 
    TCP 0.0.0.0:2000   0.0.0.0:0    LISTENING 

Me estoy perdiendo algo? ¿Que esta pasando?

Respuesta

1

Supongo que Windows permite esto debido a la historia. Es un pequeño problema de seguridad. Consulte http://msdn.microsoft.com/en-us/library/ms740618 para obtener información sobre cómo interactúan las opciones involucradas. Qué toma obtiene una conexión no está definida. Tal vez, si reduce la versión de Windows que está utilizando, podría reducir la respuesta, aunque probablemente sea para no depender de ella.

+0

sí, solo en windows, no en linux. – secmask

2

Lo que está viendo es lo que se supone que debe hacer reuseAddress. Varios sockets se pueden enlazar a la misma IP/Puerto al mismo tiempo, independientemente de sus estados.

+0

cuando un nuevo cliente de ingresos se conecta a este puerto, ¿cuál de los duplicados aceptará el cliente? ¿podría proporcionar algunos documentos, enlaces sobre esto? – secmask

+1

Cuando varios sockets están vinculados a la misma IP/Puerto al mismo tiempo, su comportamiento no está definido. Cualquier cosa puede suceder. No hay forma de predecirlo. Es MUY mala práctica hacer esto por exactamente esta razón. 'reuseAddress' solo debe usarse cuando haya enlazado su propio socket, luego lo haya cerrado, y necesite volver a abrir el mismo IP/Puerto para un nuevo socket antes de que el socket anterior haya terminado cualquier estado de espera cuando esté seguro de que no habrá más datos llegar por el viejo zócalo. –

Cuestiones relacionadas