Вопрос: Повторное использование ServerSocketAddress позволяет связать с уже связанным портом?


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

Я что-то упускаю? Что происходит?


6


источник


Ответы:


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


1



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


2