सॉकेट प्रोग्रामिंग में AF_INET और PF_INET में क्या अंतर है?
मैं में AF_INET और PF_INET का उपयोग कर के बीच उलझन में हूँ socket()
और bind()
।
इसके अलावा, sin_addr
क्षेत्र में आईपी-पता कैसे दें ?
सॉकेट प्रोग्रामिंग में AF_INET और PF_INET में क्या अंतर है?
मैं में AF_INET और PF_INET का उपयोग कर के बीच उलझन में हूँ socket()
और bind()
।
इसके अलावा, sin_addr
क्षेत्र में आईपी-पता कैसे दें ?
जवाबों:
Beej के प्रसिद्ध नेटवर्क प्रोग्रामिंग गाइड एक अच्छी व्याख्या देता है:
कुछ प्रलेखन में, आप एक रहस्यमय "PF_INET" का उल्लेख देखेंगे। यह एक अजीब ईथर जानवर है जो शायद ही कभी प्रकृति में देखा जाता है, लेकिन मैं इसे यहां थोड़ा स्पष्ट कर सकता हूं। एक बार बहुत समय पहले, यह सोचा गया था कि शायद एक पता परिवार ("AF_INET" में "AF" क्या है) कई प्रोटोकॉल का समर्थन कर सकता है जो उनके प्रोटोकॉल परिवार द्वारा संदर्भित थे ("PF_INET" में "PF" क्या है) )।
ऐसा नहीं हुआ। ओह अच्छा। तो करने के लिए सही बात यह है कि अपने कॉल में सॉकेट () में AF_INET का उपयोग अपने संरचनात्मक sockaddr_in और PF_INET में करें। लेकिन व्यावहारिक रूप से, आप हर जगह AF_INET का उपयोग कर सकते हैं। और, चूंकि डब्ल्यू। रिचर्ड स्टीवंस ने अपनी पुस्तक में लिखा है, वही मैं यहाँ करूँगा।
मैंने लिनक्स कर्नेल स्रोत कोड में पाया कि PF_INET और AF_INET समान हैं। निम्न कोड फ़ाइल से है / लिनक्स / सॉकेट.एच , लाइन 204 लिनक्स कर्नेल 3.2.21 पेड़।
/* Protocol families, same as address families. */
...
#define PF_INET AF_INET
/usr/src/linux-headers-<kernel_version>/include/linux/socket.h
अर्थ, AF_INET
इंटरनेट से पतों को संदर्भित करता है, आईपी पते विशेष रूप से। PF_INET
प्रोटोकॉल में कुछ भी संदर्भित करता है, आमतौर पर सॉकेट / पोर्ट।
सॉकेट (2) और बाइंड (2) के लिए मैन पेज पढ़ने पर विचार करें । के लिए sin_addr
क्षेत्र, बस इसे स्थापित करने के लिए निम्नलिखित की तरह कुछ कार्य करें:
struct sockaddr_in addr;
inet_pton(AF_INET, "127.0.0.1", &addr.sin_addr);
man <section> <topic>
, उदा man 2 bind
।
वास्तव में, AF_ और PF_ एक ही चीज हैं। विकिपीडिया पर कुछ शब्द हैं जो आपके भ्रम को दूर करेंगे
सॉकेट इंटरफ़ेस की मूल डिज़ाइन अवधारणा प्रोटोकॉल प्रकारों (परिवारों) और विशिष्ट पते प्रकारों के बीच भिन्न होती है जिसका उपयोग प्रत्येक व्यक्ति कर सकता है। यह कल्पना की गई थी कि एक प्रोटोकॉल परिवार में कई पते प्रकार हो सकते हैं। पता प्रकारों को अतिरिक्त प्रतीकात्मक स्थिरांक द्वारा परिभाषित किया गया था, PF_ के बजाय उपसर्ग AF_ का उपयोग करते हुए। AF_-पहचानकर्ता उन सभी डेटा संरचनाओं के लिए अभिप्रेत हैं जो विशेष रूप से पता प्रकार से निपटते हैं और प्रोटोकॉल परिवार से नहीं। हालांकि, प्रोटोकॉल और पते के प्रकार के पृथक्करण की इस अवधारणा को कार्यान्वयन समर्थन नहीं मिला है और AF_-constants केवल इसी प्रोटोकॉल पहचानकर्ता द्वारा परिभाषित किए गए थे, AF_ बनाम PF_ के बीच अंतर का प्रतिपादन करते हुए कोई महत्वपूर्ण व्यावहारिक परिणाम का तकनीकी तर्क नहीं देता है। वास्तव में, दोनों रूपों के उचित उपयोग में बहुत भ्रम है।
AF_INET = पता प्रारूप, इंटरनेट = आईपी पते
PF_INET = पैकेट प्रारूप, इंटरनेट = आईपी, टीसीपी / आईपी या यूडीपी / आईपी
AF_INET वह पता परिवार है जो आपके द्वारा बनाए जा रहे सॉकेट के लिए उपयोग किया जाता है (इस मामले में इंटरनेट प्रोटोकॉल पता)। उदाहरण के लिए, लिनक्स कर्नेल, 29 अन्य पते वाले परिवारों जैसे UNIX सॉकेट्स और IPX और IRDA और ब्लूटूथ (AF_IRDA और AF_BLUETOOTH) के साथ संचार का समर्थन करता है, लेकिन यह संदिग्ध है कि आप इनका उपयोग इतने कम स्तर पर करेंगे)।
नेटवर्क पर सॉकेट प्रोग्रामिंग के लिए AF_INET के साथ चिपके रहने वाले अधिकांश भाग के लिए सबसे सुरक्षित विकल्प है।
मतलब, AF_INET का तात्पर्य इंटरनेट से प्राप्त पतों, विशेष रूप से आईपी पतों से है।
PF_INET प्रोटोकॉल में कुछ भी संदर्भित करता है, आमतौर पर सॉकेट्स / पोर्ट्स।
ऐसी स्थितियां हैं जहां यह मायने रखता है।
यदि आप socket()
Cygwin में AF_INET पास करते हैं, तो आपका सॉकेट अनियमित रूप से रीसेट हो भी सकता है और नहीं भी। PF_INET पास करना सुनिश्चित करता है कि कनेक्शन सही काम करता है।
Cygwin स्वयं वैसे सॉकेट प्रोग्रामिंग के लिए एक बहुत बड़ा गड़बड़ है, लेकिन यह है एक वास्तविक दुनिया मामले में जहां AF_INET और PF_INET समान नहीं हैं।
#define PF_INET AF_INET
साइग्विन में पाता हूं socket.h
।
हेडर फ़ाइल को हल करने से समस्या हल हो रही है। कोई भी सिस्टम संकलक के लिए जाँच कर सकता है।
मेरे सिस्टम के लिए, AF_INET == PF_INET
AF == पता परिवार और PF == प्रोटोकॉल परिवार
प्रोटोकॉल परिवारों, पता परिवारों के रूप में ही।
/usr/src/linux-headers-X.X.X-XX-generic/include/linux/socket.h