2011-02-18 136 views
6

當使用Netty,我很驚訝,如果我使用reuseAddress選項,它可以讓一個ServerSocket綁定到相同的地址不會引發「已經綁定異常」ServerSocket reuseAddress是否允許綁定到已經綁定的端口?

 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允許新的socket重用一個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 

我錯過了什麼嗎?這是怎麼回事?

回答

1

我認爲Windows允許這由於歷史。這是一個安全問題。請參閱http://msdn.microsoft.com/en-us/library/ms740618瞭解有關所涉及選項如何交互的一些信息。哪個套接字獲得連接是未定義的。也許如果你縮小你使用的Windows版本,你可以縮小響應的範圍,儘管它可能只是不依賴它。

2

你所看到的是reuseAddress應該做的。不管其狀態如何,多個套接字可以同時綁定到相同的IP /端口。

+0

當新的收入客戶端連接到此端口時,哪個重複的套接字將接受客戶端?你能提供一些文件,有關這方面的鏈接嗎? – secmask 2011-02-19 04:25:44

+1

當多個套接字同時綁定到同一個IP /端口時,它們的行爲是不確定的。任何事情都可能發生。沒有辦法預測它。正是出於這個原因,這是非常糟糕的做法。 `````````````````````````````````````````````只有在綁定自己的套接字後才能使用`reuseAddress`,然後關閉它並且需要在舊套接字完成任何等待狀態之前重新打開一個新套接字的IP /到達舊插座。 – 2011-02-22 08:37:00