2013-03-04 14 views
22

में मैं नीचे एक बंदरगाह के लिए एक सॉकेट बाध्य करने के लिए प्रयास कर रहा हूँ:बाइंड विफल रहा है: पता पहले से ही उपयोग

if(bind(socket_desc,(struct sockaddr *) &server, sizeof(server)) < 0) 
{ 
    perror("bind failed. Error"); 
    return 1; 
} 
puts("bind done"); 

लेकिन यह देता है:

$ ./serve 
Socket created  
bind failed. Error: Address already in use 

यह त्रुटि क्यों हो जाता है?

+1

एक अलग पोर्ट नंबर का उपयोग करें? – Nick

+2

एक ऐसे पते का उपयोग करें जो पहले से उपयोग में नहीं है। –

+0

मुझे मिल गया .. मैं अलग-अलग बंदरगाहों का चयन करता हूं ... मदद के लिए धन्यवाद .. धन्यवाद सब कुछ। – TamiL

उत्तर

18

त्रुटि आमतौर पर इसका मतलब है कि बंदरगाह खोलने का प्रयास कर रहे हैं पहले से ही अन्य एप्लिकेशन द्वारा उपयोग किया जा रहा है netstat का उपयोग कर जो बंदरगाहों खुले हैं देखते हैं और फिर एक उपलब्ध पोर्ट का उपयोग करने का प्रयास करें।

यह भी जांच करता है, तो आप सही आईपी पते के लिए बाध्य कर रहे हैं (मैं इसे स्थानीय होस्ट किया जाएगा संभालने हूँ)

+1

पर एक प्रासंगिक प्रश्न जैसा प्रतीत होता है यह भी हो सकता है कि आप फिडलर (http://www.telerik.com/fiddler) जैसे वेब डिबगिंग प्रॉक्सी चला रहे हैं। मुझे अपनी मशीन पर वही त्रुटि मिल रही थी, मैंने फिडलर बंद कर दिया, और बस ठीक आगे बढ़ने में सक्षम था। – farskeptic

+1

यह भी हो सकता है कि TIME-WAIT राज्य में बचे हुए बंदरगाह हैं। यदि आईपी पता गलत था तो त्रुटि 'अनुरोधित पता असाइन नहीं कर सकती' होती, और डिफ़ॉल्ट जिसे माना जाना चाहिए 'localhost' नहीं बल्कि INADDR_ANY है। – EJP

15

आप एक प्रक्रिया है कि पहले से ही है कि बंदरगाह का उपयोग कर सकते है। netstat -tulpn किसी को एक विशेष पोर्ट का उपयोग कर प्रक्रिया आईडी ढूंढने में सक्षम बनाता है।

36

हर कोई सही है। हालांकि, अगर आप भी अपने कोड का परीक्षण व्यस्त हो अपने खुद आवेदन अभी भी सॉकेट "के मालिक हैं" हो सकता है अगर यह शुरू होता है और अपेक्षाकृत जल्दी बंद हो जाता है। सॉकेट विकल्प के रूप में SO_REUSEADDR आज़माएं:

SO_REUSEADDR वास्तव में क्या करता है?

यह सॉकेट विकल्प कर्नेल को बताता है कि भले ही यह पोर्ट व्यस्त है ( TIME_WAIT स्थिति में), आगे बढ़ें और फिर भी इसका पुन: उपयोग करें। यदि यह व्यस्त है, लेकिन किसी अन्य स्थिति के साथ, आपको अभी भी त्रुटि का उपयोग करने में कोई पता मिलेगा। यह उपयोगी है अगर आपका सर्वर बंद कर दिया गया है, और फिर तुरंत बंद हो गया है जबकि सॉकेट अभी भी अपने बंदरगाह पर सक्रिय हैं। आप ध्यान रखें कि यदि किसी भी अप्रत्याशित डेटा में आता है, यह अपने सर्वर भ्रमित हो सकते हैं होना चाहिए, लेकिन जब तक यह संभव है, यह संभावना नहीं है।

यह बताया गया है कि "एक सॉकेट एक 5 टपल (आद्य, स्थानीय addr, स्थानीय बंदरगाह, दूरस्थ addr, दूरदराज के बंदरगाह) है। SO_REUSEADDR सिर्फ का कहना है कि आप स्थानीय पते का पुन: उपयोग कर सकते हैं। 5 टपल अभी भी चाहिए अद्वितीय हो! " माइकल हंटर द्वारा ([email protected])। यह सच है, और क्यों यह बहुत संभावना नहीं है कि अप्रत्याशित डेटा कभी अपने सर्वर द्वारा देखा जाएगा है इस है। खतरा यह है कि इस तरह के 5 ट्यूपल अभी भी नेट पर चारों ओर तैर रहे हैं, और जब यह आसपास की ओर बढ़ रहा है, उसी सिस्टम पर एक ही ग्राहक से एक नया कनेक्शन, उसी रिमोट पोर्ट प्राप्त होता है। यह `2.7 में रिचर्ड स्टीवंस द्वारा समझाया गया है कृपया TIME_WAIT स्थिति की व्याख्या करें।"

+1

https://easyengine.io/tutorials/nginx/troubleshooting/emerg-bind-failed-98-address-already-in-use/ ऊपर लिंक केवल मेरी समस्या को ठीक करता है ... हालांकि मैंने (SO_REUSEADDR | SO_REUSEPORT) का उपयोग किया था यह समस्या दोनों हुई। –

+1

@iDebD_gh SO_REUSEPORT केवल यूडीपी के लिए है। – EJP

+0

सावधान रहें यदि लोड बैलेंसर के पीछे प्रश्न में बंदरगाह है तो SO_REUSEADDR में नकारात्मक रैमिकेशन हो सकते हैं। – kmarsh

4

जैसा ऊपर बताया गया है कि पोर्ट पहले से उपयोग में है। यह कई कारणों से हो सकता है

  1. कुछ अन्य एप्लिकेशन पहले से ही इसका उपयोग कर रहा है।
  2. पोर्ट close_wait स्थिति में है जब आपका प्रोग्राम प्रोग्राम को बंद करने के दूसरे छोर के लिए इंतजार कर रहा है .refer (https://unix.stackexchange.com/questions/10106/orphaned-connections-in-close-wait-state)।
  3. कार्यक्रम time_wait राज्य में हो सकता है। आप किसी अन्य पोस्ट में उल्लिखित सॉकेट विकल्प SO_REUSEADDR का इंतजार या उपयोग कर सकते हैं।

पोर्ट स्थिति की जांच के लिए netstat -a | grep <portno> करें।

+6

हम इस पोर्ट नंबर पर मैन्युअल रूप से इस एप्लिकेशन को कैसे रोक सकते हैं? – user2925949

+0

बंद-WAIT का अर्थ है कि बंदरगाह इस अंत को बंद करने का इंतजार कर रहा है, रिमोट एंड नहीं। आपका लिंक भी यही कहता है। – EJP

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