ServerSocket reuseAddress разрешить привязку к уже связанному порту? - PullRequest
6 голосов
/ 18 февраля 2011

При использовании Netty я был удивлен, что, если я использую опцию reuseAddress, он позволяет ServerSocket связываться с тем же адресом, не вызывая «исключение уже связывания»

        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));

Я просто подумал, что reuseAddress позволяет новому сокету повторно использовать сокет с близким ожиданием, но это не так. Ниже приведен результат команды 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

Я что-то упустил? Что происходит?

Ответы [ 2 ]

2 голосов
/ 18 февраля 2011

То, что вы видите, это то, что reuseAddress должен делать. Несколько сокетов могут быть связаны с одним и тем же IP / портом одновременно, независимо от их состояния.

1 голос
/ 20 февраля 2011

Я предполагаю, что Windows позволяет это из-за истории.Это немного проблема безопасности.См. http://msdn.microsoft.com/en-us/library/ms740618 для получения некоторой информации о том, как взаимодействуют вовлеченные опции.Какой сокет получает соединение, не определено.Возможно, если вы сузите версию используемой вами Windows, вы можете сузить ответ, хотя, вероятно, это просто не зависит от нее.

...