सॉकेट प्रोग्रामिंग में AF_INET और PF_INET में क्या अंतर है?


205

सॉकेट प्रोग्रामिंग में AF_INET और PF_INET में क्या अंतर है?

मैं में AF_INET और PF_INET का उपयोग कर के बीच उलझन में हूँ socket()और bind()

इसके अलावा, sin_addrक्षेत्र में आईपी-पता कैसे दें ?


बस नेट पर खोज करें: एक परिणाम यह है
Op De Cirkel

मैं यह भी सोच रहा था। वे अलग-अलग कोडरों के बीच सॉकेट कॉल में परस्पर उपयोग करने के लिए प्रतीत होते हैं।
मैट

@MattH वे दोनों नए लिनक्स कर्नेल के अनुसार समान हैं। आप नीचे ड्यूक के उत्तर में वही पा सकते हैं।
एसपी संधू

जवाबों:


250

Beej के प्रसिद्ध नेटवर्क प्रोग्रामिंग गाइड एक अच्छी व्याख्या देता है:

कुछ प्रलेखन में, आप एक रहस्यमय "PF_INET" का उल्लेख देखेंगे। यह एक अजीब ईथर जानवर है जो शायद ही कभी प्रकृति में देखा जाता है, लेकिन मैं इसे यहां थोड़ा स्पष्ट कर सकता हूं। एक बार बहुत समय पहले, यह सोचा गया था कि शायद एक पता परिवार ("AF_INET" में "AF" क्या है) कई प्रोटोकॉल का समर्थन कर सकता है जो उनके प्रोटोकॉल परिवार द्वारा संदर्भित थे ("PF_INET" में "PF" क्या है) )।
ऐसा नहीं हुआ। ओह अच्छा। तो करने के लिए सही बात यह है कि अपने कॉल में सॉकेट () में AF_INET का उपयोग अपने संरचनात्मक sockaddr_in और PF_INET में करें। लेकिन व्यावहारिक रूप से, आप हर जगह AF_INET का उपयोग कर सकते हैं। और, चूंकि डब्ल्यू। रिचर्ड स्टीवंस ने अपनी पुस्तक में लिखा है, वही मैं यहाँ करूँगा।


68

मैंने लिनक्स कर्नेल स्रोत कोड में पाया कि PF_INET और AF_INET समान हैं। निम्न कोड फ़ाइल से है / लिनक्स / सॉकेट.एच , लाइन 204 लिनक्स कर्नेल 3.2.21 पेड़।

/* Protocol families, same as address families. */
...
#define PF_INET     AF_INET

यकीन है कि ड्यूक, पिछले कर्नेल के लिए भी यही है, मेरा मतलब है कि संस्करण 3.0 से पहले गुठली?
एसपी संधू

1
जैसा कि मुझे पता है, कर्नेल और libc के सभी संस्करणों में PF_ * == AF_ *
Duke

क्या यह नॉन-लाइनक्स प्लेटफार्मों पर सच है?
गुड पर्सन

1
मुझे लगता है कि यह सुनिश्चित करने के लिए, आपको शामिल हेडर फ़ाइल की जांच करने की आवश्यकता है :)
ड्यूक

उबंटू / डेबियन पर मुझे वायुसेना की परिभाषाएँ /usr/src/linux-headers-<kernel_version>/include/linux/socket.h
मिलीं

48
  • AF = पता परिवार
  • पीएफ = प्रोटोकॉल परिवार

अर्थ, AF_INETइंटरनेट से पतों को संदर्भित करता है, आईपी पते विशेष रूप से। PF_INETप्रोटोकॉल में कुछ भी संदर्भित करता है, आमतौर पर सॉकेट / पोर्ट।

सॉकेट (2) और बाइंड (2) के लिए मैन पेज पढ़ने पर विचार करें । के लिए sin_addrक्षेत्र, बस इसे स्थापित करने के लिए निम्नलिखित की तरह कुछ कार्य करें:

struct sockaddr_in addr;
inet_pton(AF_INET, "127.0.0.1", &addr.sin_addr); 

धन्यवाद @codemac, मैंने addr.sin_addr.s_addr = inet_addr ("127.0.0.1") का उपयोग किया है; लेकिन inet_pton () के लिए क्या है?
एसपी संधू

मैन पेजों के लिए भी, जब मैं टाइप मैन बाइंड (2) या मैन बाइंड (), टर्मिनल अप्रत्याशित टोकन देता है '(' त्रुटि जबकि मैन बाइंड बैश बिल्डिंस में बाइंड का स्पष्टीकरण देता है। बाइंड के लिए मैन पेज कैसे प्राप्त करें) ()। बाइंड () समारोह?
एसपी संधू

@ jatt.beas: वाक्यविन्यास है man <section> <topic>, उदा man 2 bind
फ्राईच रायबे

11

वास्तव में, AF_ और PF_ एक ही चीज हैं। विकिपीडिया पर कुछ शब्द हैं जो आपके भ्रम को दूर करेंगे

सॉकेट इंटरफ़ेस की मूल डिज़ाइन अवधारणा प्रोटोकॉल प्रकारों (परिवारों) और विशिष्ट पते प्रकारों के बीच भिन्न होती है जिसका उपयोग प्रत्येक व्यक्ति कर सकता है। यह कल्पना की गई थी कि एक प्रोटोकॉल परिवार में कई पते प्रकार हो सकते हैं। पता प्रकारों को अतिरिक्त प्रतीकात्मक स्थिरांक द्वारा परिभाषित किया गया था, PF_ के बजाय उपसर्ग AF_ का उपयोग करते हुए। AF_-पहचानकर्ता उन सभी डेटा संरचनाओं के लिए अभिप्रेत हैं जो विशेष रूप से पता प्रकार से निपटते हैं और प्रोटोकॉल परिवार से नहीं। हालांकि, प्रोटोकॉल और पते के प्रकार के पृथक्करण की इस अवधारणा को कार्यान्वयन समर्थन नहीं मिला है और AF_-constants केवल इसी प्रोटोकॉल पहचानकर्ता द्वारा परिभाषित किए गए थे, AF_ बनाम PF_ के बीच अंतर का प्रतिपादन करते हुए कोई महत्वपूर्ण व्यावहारिक परिणाम का तकनीकी तर्क नहीं देता है। वास्तव में, दोनों रूपों के उचित उपयोग में बहुत भ्रम है।


4

AF_INET = पता प्रारूप, इंटरनेट = आईपी पते

PF_INET = पैकेट प्रारूप, इंटरनेट = आईपी, टीसीपी / आईपी या यूडीपी / आईपी

AF_INET वह पता परिवार है जो आपके द्वारा बनाए जा रहे सॉकेट के लिए उपयोग किया जाता है (इस मामले में इंटरनेट प्रोटोकॉल पता)। उदाहरण के लिए, लिनक्स कर्नेल, 29 अन्य पते वाले परिवारों जैसे UNIX सॉकेट्स और IPX और IRDA और ब्लूटूथ (AF_IRDA और AF_BLUETOOTH) के साथ संचार का समर्थन करता है, लेकिन यह संदिग्ध है कि आप इनका उपयोग इतने कम स्तर पर करेंगे)।

नेटवर्क पर सॉकेट प्रोग्रामिंग के लिए AF_INET के साथ चिपके रहने वाले अधिकांश भाग के लिए सबसे सुरक्षित विकल्प है।

मतलब, AF_INET का तात्पर्य इंटरनेट से प्राप्त पतों, विशेष रूप से आईपी पतों से है।

PF_INET प्रोटोकॉल में कुछ भी संदर्भित करता है, आमतौर पर सॉकेट्स / पोर्ट्स।


3

ऐसी स्थितियां हैं जहां यह मायने रखता है।

यदि आप socket()Cygwin में AF_INET पास करते हैं, तो आपका सॉकेट अनियमित रूप से रीसेट हो भी सकता है और नहीं भी। PF_INET पास करना सुनिश्चित करता है कि कनेक्शन सही काम करता है।

Cygwin स्वयं वैसे सॉकेट प्रोग्रामिंग के लिए एक बहुत बड़ा गड़बड़ है, लेकिन यह है एक वास्तविक दुनिया मामले में जहां AF_INET और PF_INET समान नहीं हैं।


6
कृपया समझाएँ। मैं #define PF_INET AF_INETसाइग्विन में पाता हूं socket.h
लोर्न

3

हेडर फ़ाइल को हल करने से समस्या हल हो रही है। कोई भी सिस्टम संकलक के लिए जाँच कर सकता है।

मेरे सिस्टम के लिए, AF_INET == PF_INET

AF == पता परिवार और PF == प्रोटोकॉल परिवार

प्रोटोकॉल परिवारों, पता परिवारों के रूप में ही।

यहां छवि विवरण दर्ज करें


1
/usr/src/linux-headers-X.X.X-XX-generic/include/linux/socket.h
noobninja
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.