2011-12-26 11 views
9

ठीक है, मेरा प्रश्न मूलभूत सामान की तरह दिख सकता है, लेकिन मैं नेटवर्क प्रोग्रामिंग पक्ष के लिए नया हूं। मैं जानना चाहता हूं:क्या इसे हमेशा सॉकेट बांधना आवश्यक है?

1) क्या उसे हमेशा संदेश प्राप्त करने के लिए सॉकेट बांधना आवश्यक है? मैंने एक स्निफर कोड (कच्चा सॉकेट) देखा जिसमें एक सीधे यह recvfrom का आविष्कार कर रहा है और कोड का एक और टुकड़ा जिसमें यह bind का आविष्कार कर रहा है और फिर प्राप्त होता है।

2) AF_ * और PF_ * परिवार के बीच क्या अंतर है? बाद में पॉज़िक्स से संबंधित है? किसकी सिफारिश की जाती है?

+0

1) नहीं, यूडीपी प्राप्त करने के लिए बाध्यकारी वैकल्पिक है। –

+0

http://stackoverflow.com/questions/2549461/what-is-the-difference-between-af-inet-and-pf-inet-constants। आईआईआरसी, पी प्रोटोकॉल (परिवार) के लिए खड़ा है जबकि ए पता के लिए खड़ा है। – Aif

+0

@ केरेक एसबी: लेकिन मैं जिस स्निफर कोड का जिक्र कर रहा हूं, वह अन्य प्रोटोकॉल से पैकेट को कैप्चर करता है लेकिन फिर भी इसे 'बाइंड' – kingsmasher1

उत्तर

8

नहीं, आपको बाध्य करने की आवश्यकता नहीं है()।

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

यह भी AF_UNIX सॉकेट के बारे में भी सच है - क्लाइंट पक्ष को बांधने की आवश्यकता नहीं है, और सामान्य रूप से ऐसा नहीं करना चाहिए।

+0

तो आप केरेकस्क के साथ असहमत हैं जहां वह कहता है कि यह केवल पैकेट प्राप्त करने के लिए है। सही? यहां तक ​​कि कनेक्ट की आवश्यकता नहीं है क्योंकि आप उपरोक्त लिंक से देख सकते हैं। 'Socket 'के लिए बस एक कॉल' revfrom' – kingsmasher1

+0

के बाद मैं टीसीपी या यूडीपी सॉकेट के बारे में बात कर रहा था। कच्चे सॉकेट में क्या होता है वास्तव में प्रासंगिक नहीं है। – MarkR

+0

क्या आप समझा सकते हैं क्यों बाध्यकारी क्लाइंट सॉकेट को हानिकारक माना जाता है? – Pacerier

0

मुझे लिनक्स के बारे में पता नहीं है, लेकिन विंडोज़ पर, यदि recvfrom() को एक अनबाउंड सॉकेट पर बुलाया जाता है, तो यह WSAEINVAL त्रुटि के साथ विफल हो जाएगा।

+0

मुझे नहीं लगता कि यह एक यूडीपी सॉकेट पर पैकेट प्राप्त करने का प्रयास करना उपयोगी है जो एक विशिष्ट बंदरगाह से बंधे नहीं है, जब तक कि आप पहले से ही कुछ नहीं भेजते। "देखभाल न करें" बंदरगाह पर सॉकेट बांधना संभव है, फिर पोर्टॉक को getockname के साथ ढूंढें। उदाहरण के लिए, यदि मैं किसी सर्वर से पैकेट प्राप्त करने के लिए यूडीपी का उपयोग करना चाहता था, लेकिन आदेश भेजने के लिए टीसीपी का उपयोग करें (उदाहरण के लिए) - उदाहरण के लिए, कुछ स्ट्रीमिंग स्थिति में जहां मुझे केवल यूडीपी में प्राप्त होता है, कभी नहीं भेजें।मुझे पोर्ट 0 से बंधना होगा (परवाह नहीं है) और उसके बाद सर्वर पर मेरे प्रोटोकॉल (टीसीपी) पर पोर्ट नंबर पास करना होगा। – MarkR

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