2012-09-10 15 views
7

मैं विंडोज 7 में स्टनल के दो उदाहरण चला रहा हूं, उसी पोर्ट को सुनने के लिए कॉन्फ़िगर किया गया है, और ऐसा प्रतीत होता है कि वे दोनों एक ही पोर्ट पर सफलतापूर्वक सुन रहे हैं (केवल सॉकेट()/बाइंड()/सुनो() का उपयोग कर रहे हैं। दोनों उदाहरणों सभी कॉल्स के साथ सफल होने के लिए दिखाई देते हैं और वे एक netstat में दिखाने:विंडोज 7 में एक ही बंदरगाह को दो प्रक्रियाओं को कैसे सुन रहे हैं?

C:\>netstat -ano | grep 8000 
    TCP 0.0.0.0:8000   0.0.0.0:0    LISTENING  5828 
    TCP 0.0.0.0:8000   0.0.0.0:0    LISTENING  5852 

पहले एक सुनने के लिए आने वाले सभी अनुरोधों हो जाता है।

यह मेरी सभी अपेक्षाओं के विपरीत काफी विपरीत है। (मैं उम्मीद कर रहा था कि EADDRINUSE मुझे पोर्ट बता रहा था व्यस्त था।) तो ....

  1. यह कैसे काम करता है? क्या यह व्यवहार कुछ संदर्भ में उपयोगी है?
  2. यदि कोई अन्य एप्लिकेशन इनकमिंग अनुरोधों को पकड़ने जा रहा है तो मैं सफल रन नहीं चाहता हूं ... मैं पोर्ट को अनन्य कैसे बना सकता हूं?

उत्तर

7

यह पूरा किया जा सकता है अगर सॉकेट ध्वज SO_REUSEADDR के साथ खोला गया था, जो टीसीपी सॉकेट अनुप्रयोगों के लिए असामान्य नहीं है।

आमतौर पर, SO_REUSEADDR दो चीजों में से एक के लिए प्रयोग किया जाता है:

  1. जब एक प्रक्रिया क्रैश हो गई, मारे गए, या जबरन को पुनः आरंभ अपने सॉकेट बंद करने के लिए एक मौका हो रही बिना। या प्रक्रिया समाप्त हो गई है लेकिन सॉकेट (या बाल कनेक्शन सॉकेट) अभी भी एक FIN_WAIT या FIN_WAIT2 स्थिति में है। दूसरी प्रक्रिया "पहले से उपयोग में" त्रुटि कोड प्राप्त किए बिना सॉकेट खोल सकती है। मैंने एसओ पर कुछ पोस्ट पढ़ी हैं। यह सुझाव देते हुए कि यह टीसीपी सॉकेट के लिए सबसे अच्छा अभ्यास है।

  2. वही सर्वर प्रोग्राम या तो कई बार फोर्क या चलाता है। यह थ्रेड के उपयोग के लिए लिखे गए सर्वर प्रोग्राम के बिना भार संतुलन की अनुमति देता है। आम तौर पर, सॉकेट पर सुन रहे कार्यक्रम का "अन्य उदाहरण" आने वाले कनेक्शन स्वीकार करेगा, जबकि पहले किसी अन्य कनेक्शन के साथ व्यस्त है।

आपके दूसरे प्रश्न के संबंध में, सबसे आसान काम SO_REUSEADDR का उपयोग नहीं है। यदि आप चिंतित हैं कि एक दुष्ट ऐप हो सकता है जो SO_REUSADDR का उपयोग करने का प्रयास करता है, तो आपका ऐप SO_EXCLUSIVEADDRUSE का उपयोग कर सकता है। (एक ध्वज, जो मूल रूप से कहता है, "अन्य ऐप्स को SO_REUSEADDR के साथ इस पोर्ट को खोलने की अनुमति न दें।)

+0

धन्यवाद, मैंने सोचा था कि ध्वज उसी नाम के यूनिक्स ध्वज के समान था। एमएसडीएन प्रबुद्ध था: http: //msdn.microsoft.com/en-us/library/windows/desktop/ms740621(v=vs.85).aspx – Olson