2009-07-02 13 views
38

मुझे ऐसे ऐप की आवश्यकता है जो कुछ नेटवर्क सर्वर पर यूडीपी पैकेट भेजता है और प्रतिक्रिया प्राप्त करता है। सर्वर उसी पोर्ट नंबर पर जवाब देता है जहां से अनुरोध आया था, इसलिए मुझे पहले किसी भी यूडीपी पोर्ट नंबर पर अपनी सॉकेट को बाध्य करने की आवश्यकता है।किसी भी उपलब्ध पोर्ट से कैसे जुड़ें?

यूडीपी पोर्ट नंबर हार्डकोडिंग एक बुरा विचार है, क्योंकि इसका उपयोग उसी पीसी पर चल रहे किसी अन्य एप्लिकेशन द्वारा किया जा सकता है।

क्या किसी भी बंदरगाह पर यूडीपी सॉकेट बांधने का कोई तरीका है? आईएमओ इसे मुफ्त पोर्ट # को तुरंत प्राप्त करने का एक प्रभावी तरीका होना चाहिए, जिसका उपयोग उदाहरण के द्वारा किया जाता है। स्वीकार करें() फ़ंक्शन।

यदि नहीं, तो बाध्यकारी कोशिश करने और WSAEADDRINUSE/EADDRINUSE स्थिति की जांच करने के लिए सबसे अच्छी रणनीति क्या है: अनुक्रमिक रूप से 1025, या 1025 + रैंड(), या किसी अन्य से शुरू होने वाले बंदरगाहों को आजमाएं?

+1

स्वीकार() कनेक्शन आधारित सॉकेट में उपयोग किया जाता है, डेटाग्राम वाले नहीं। – Beano

+1

शायद यह मदद करेगा: http://serverfault.com/questions/447044 – yegor256

+0

POSIX में? इसके अलावा 1024+ रेंज की आवश्यकता है: http://stackoverflow.com/questions/913501/how-to-let- कर्नेल-choose-a-port-number-in-the-range-1024-5000-in-tcp-socket- पीआर –

उत्तर

34

sendto पर कॉल करें bind पहले कॉल किए बिना, सॉकेट स्वचालित रूप से बाध्य हो जाएगा (एक मुक्त बंदरगाह पर)।

+5

डाउनवॉटिंग सिर्फ इसलिए कि सही उत्तर @ रेमी का होना चाहिए (बांध में पोर्ट 0 का उपयोग करना)। – claf

+4

@claf implicit bind भी बाध्य है, है ना? दोनों जवाब मेरी राय में उपयोगी हैं। – WGH

+0

@WGH: आप सही हैं, यह व्यवहार विंडोज सॉकेट के लिए दस्तावेज किया गया है (नोट: यदि सॉकेट खोला जाता है, तो सेटोकॉप्ट कॉल किया जाता है, और फिर एक प्रेषण कॉल किया जाता है, विंडोज सॉकेट एक अंतर्निहित बाइंड कॉल कॉल करता है।) लेकिन मैं मुझे यकीन नहीं है कि यह अन्य कार्यान्वयन के मामले में है। इसके अलावा, निहित कॉल पर मेरी राय यह है कि यह एक बुरी आदत है। – claf

0

मुझे कुछ याद आना चाहिए, आप वापस डेटा भेजने के लिए udp सॉकेट का उपयोग क्यों नहीं करते? प्रेषण के साथ प्रारंभ करें और फिर आने वाले डेटा को पढ़ने के लिए रिकॉर्फ़ॉम फ़ंक्शन का उपयोग करें, आपको एक बोनस के रूप में मिलता है जिस से डेटा भेजा गया था, वहां आपके लिए प्रतिक्रिया वापस भेजने के लिए।

+0

कुछ प्रोटोकॉल आपको यह सुनिश्चित करने की आवश्यकता है कि आप अपने अंत में किस पोर्ट नंबर का उपयोग कर रहे हैं। उदाहरण के लिए, [टीएफटीपी] (http://tools.ietf.org/html/rfc1350) ग्राहक उसी सर्वर से एकाधिक समवर्ती स्थानान्तरण के बीच अंतर करने के लिए इसका उपयोग करते हैं। सर्वर सिर्फ उसी पोर्ट से वापस नहीं भेज सकता है, प्रत्येक फ़ाइल स्थानांतरण के लिए सर्वर को एक अलग स्रोत पोर्ट से भेजने की आवश्यकता होती है। जैसा कि आपने उल्लिखित किया है, सर्वर क्लाइंट स्रोत पता और पोर्ट का उत्तर देता है। – doug65536

+1

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

+0

@ doug65536 एक मान्य उदाहरण है लेकिन मूल प्रश्न में क्यों कोई विशिष्ट विवरण नहीं था। – Jonke

168

दूसरा विकल्प पोर्ट 0 से bind() निर्दिष्ट करना है। इससे आपको एक विशिष्ट आईपी पते से जुड़ने की अनुमति मिल जाएगी (यदि आपके पास एकाधिक स्थापित है) जबकि अभी भी एक यादृच्छिक बंदरगाह पर बाध्यकारी है। यदि आपको पता होना चाहिए कि कौन सा बंदरगाह चुना गया था, तो बाध्यकारी प्रदर्शन के बाद आप getsockname() का उपयोग कर सकते हैं।

+18

बंदरगाह 0 के लिए बाध्यकारी एक ओएस-असाइन किए गए यादृच्छिक बंदरगाह से बांधने का आधिकारिक दस्तावेज तरीका है। –

+0

दस्तावेज कहाँ? ऐसा नहीं है कि मैं यह गलत कह रहा हूं, मैं एक आधिकारिक बयान देखना चाहता हूं। –

+8

यह ['bind()'] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms737550.aspx) में है प्रलेखन: "यदि पोर्ट शून्य के रूप में निर्दिष्ट है, तो सेवा प्रदाता गतिशील क्लाइंट पोर्ट रेंज से एप्लिकेशन के लिए एक अद्वितीय बंदरगाह निर्दिष्ट करता है। विंडोज विस्टा और बाद में, डायनामिक क्लाइंट पोर्ट रेंज 49152 और 65535 के बीच एक मान है। यह विंडोज सर्वर 2003 और इससे पहले कि गतिशील क्लाइंट पोर्ट रेंज में एक बदलाव है 1025 और 5000 के बीच एक मूल्य था ... सॉकेट को सौंपा गया पता और पोर्ट सीखने के लिए बाध्य कॉल करने के बाद एप्लिकेशन होटॉकनाम का उपयोग कर सकता है। " –

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