2011-02-18 8 views
6

जब 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 एक नया सॉकेट की अनुमति देता है को ऊपर उठाने के बिना एक ही पते से आबद्ध होने देती एक करीबी प्रतीक्षा सॉकेट का पुन: उपयोग करने के लिए, लेकिन यह अलग है। निम्नलिखित नेटस्टैट कमांड का परिणाम

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

मुझे लगता है कि विंडोज इतिहास के कारण इसकी अनुमति देता है। यह एक सुरक्षा मुद्दा है। शामिल विकल्प कैसे इंटरैक्ट करते हैं, इस बारे में कुछ जानकारी के लिए http://msdn.microsoft.com/en-us/library/ms740618 देखें। कौन सा सॉकेट कनेक्शन प्राप्त करता है अपरिभाषित है। हो सकता है कि यदि आप विंडोज़ के संस्करण को संकुचित करते हैं तो आप इसका उपयोग कर रहे हैं कि प्रतिक्रिया क्या होगी, हालांकि यह शायद इस पर निर्भर न हो।

+0

हाँ, यह केवल खिड़कियों पर, लिनक्स नहीं है। – secmask

2

जो आप देख रहे हैं वह है reuseAddress क्या करना है। अपने राज्यों के बावजूद, एकाधिक सॉकेट एक ही समय में एक ही आईपी/पोर्ट से बंधे जा सकते हैं।

+0

जब नया आय क्लाइंट इस बंदरगाह से कनेक्ट होता है, तो उस डुप्लिकेट सॉकेट में से कौन सा क्लाइंट स्वीकार करेगा? क्या आप इसके बारे में कुछ दस्तावेज़, लिंक प्रदान कर सकते हैं? – secmask

+1

जब एक ही समय में एक ही आईपी/पोर्ट से कई सॉकेट बाध्य होते हैं, तो उनका व्यवहार अपरिभाषित होता है। कुछ भी हो सकता है। भविष्यवाणी करने का कोई तरीका नहीं है। इस कारण से ऐसा करने के लिए यह बहुत बुरा अभ्यास है। 'reuseAddress' का उपयोग तब किया जाना चाहिए जब आपने अपना सॉकेट बाध्य किया हो, फिर इसे बंद कर दें, और पुराने सॉकेट ने किसी भी प्रतीक्षा स्थिति को समाप्त करने से पहले एक ही आईपी/पोर्ट को एक नई सॉकेट के लिए फिर से खोलने की आवश्यकता है, जब आप सुनिश्चित हों कि कोई और डेटा नहीं होगा पुरानी सॉकेट के लिए आओ। –

संबंधित मुद्दे