यूनिक्स सॉकेट - संरचनाएं

पता और बंदरगाह, और अन्य जानकारी के बारे में जानकारी रखने के लिए यूनिक्स सॉकेट प्रोग्रामिंग में विभिन्न संरचनाओं का उपयोग किया जाता है। अधिकांश सॉकेट फ़ंक्शन को एक तर्क के रूप में सॉकेट एड्रेस संरचना के लिए एक संकेतक की आवश्यकता होती है। इस अध्याय में परिभाषित संरचनाएं इंटरनेट प्रोटोकॉल परिवार से संबंधित हैं।

sockaddr

पहली संरचना सॉक्डड्रा है जो सॉकेट जानकारी रखती है -

struct sockaddr {
   unsigned short   sa_family;
   char             sa_data[14];
};

यह एक सामान्य सॉकेट एड्रेस संरचना है, जिसे सॉकेट फ़ंक्शन कॉल में से अधिकांश में पारित किया जाएगा। निम्न तालिका सदस्य क्षेत्रों का विवरण प्रदान करती है -

गुण मूल्यों विवरण
sa_family

AF_INET

AF_UNIX

AF_NS

AF_IMPLINK

यह एक पता परिवार का प्रतिनिधित्व करता है। अधिकांश इंटरनेट-आधारित अनुप्रयोगों में, हम AF_INET का उपयोग करते हैं।
sa_data प्रोटोकॉल-विशिष्ट पता प्रोटोकॉल विशिष्ट पते के 14 बाइट्स की सामग्री को पते के प्रकार के अनुसार व्याख्या की जाती है। इंटरनेट परिवार के लिए, हम पोर्ट नंबर IP पते का उपयोग करेंगे, जो कि नीचे परिभाषित sockaddr_in संरचना द्वारा दर्शाया गया है ।

Sockaddr में

दूसरी संरचना जो आपको सॉकेट के तत्वों के संदर्भ में मदद करती है वह इस प्रकार है -

struct sockaddr_in {
   short int            sin_family;
   unsigned short int   sin_port;
   struct in_addr       sin_addr;
   unsigned char        sin_zero[8];
};

यहाँ सदस्य क्षेत्रों का वर्णन है -

गुण मूल्यों विवरण
sa_family

AF_INET

AF_UNIX

AF_NS

AF_IMPLINK

यह एक पता परिवार का प्रतिनिधित्व करता है। अधिकांश इंटरनेट-आधारित अनुप्रयोगों में, हम AF_INET का उपयोग करते हैं।
sin_port सर्विस पोर्ट नेटवर्क बाइट ऑर्डर में 16-बिट पोर्ट नंबर।
sin_addr आईपी ​​पता नेटवर्क बाइट ऑर्डर में एक 32-बिट आईपी एड्रेस।
sin_zero उपयोग नहीं किया आप इस मान को NULL पर सेट करते हैं क्योंकि इसका उपयोग नहीं किया जा रहा है।

Addr में

यह संरचना केवल उपरोक्त संरचना में संरचना क्षेत्र के रूप में उपयोग की जाती है और 32 बिट नेटिड / होस्टिड रखती है।

struct in_addr {
   unsigned long s_addr;
};

यहाँ सदस्य क्षेत्रों का वर्णन है -

गुण मूल्यों विवरण
s_addr सर्विस पोर्ट नेटवर्क बाइट ऑर्डर में एक 32-बिट आईपी एड्रेस।

hostent

इस संरचना का उपयोग होस्ट से संबंधित जानकारी रखने के लिए किया जाता है।

struct hostent {
   char *h_name; 
   char **h_aliases; 
   int h_addrtype;  
   int h_length;    
   char **h_addr_list
	
#define h_addr  h_addr_list[0]
};

यहाँ सदस्य क्षेत्रों का वर्णन है -

गुण मूल्यों विवरण
h_name ti.com आदि। यह मेजबान का आधिकारिक नाम है। उदाहरण के लिए, tutorialspoint.com, google.com, आदि।
h_aliases ती यह मेजबान नाम उपनाम की एक सूची रखता है।
h_addrtype AF_INET इसमें पता परिवार शामिल है और इंटरनेट आधारित अनुप्रयोग के मामले में, यह हमेशा AF_INET रहेगा।
h_length 4 यह IP पते की लंबाई रखता है, जो इंटरनेट पते के लिए 4 है।
h_addr_list in_addr इंटरनेट पते के लिए, संकेत h_addr_list [0], h_addr_list [1], और इसी तरह, संरचना in_addr के बिंदु हैं।

NOTE - h_addr को बैकवर्ड संगतता रखने के लिए h_addr_list [0] के रूप में परिभाषित किया गया है।

नौकर

इस विशेष संरचना का उपयोग सेवा और संबंधित बंदरगाहों से संबंधित जानकारी रखने के लिए किया जाता है।

struct servent {
   char  *s_name; 
   char  **s_aliases; 
   int   s_port;  
   char  *s_proto;
};

यहाँ सदस्य क्षेत्रों का वर्णन है -

गुण मूल्यों विवरण
s_name एचटीटीपी यह सेवा का आधिकारिक नाम है। उदाहरण के लिए, SMTP, FTP POP3 इत्यादि।
s_aliases उपनाम यह सेवा उपनामों की सूची रखता है। अधिकांश समय इसे NULL पर सेट किया जाएगा।
s_port 80 इसमें संबद्ध पोर्ट नंबर होगा। उदाहरण के लिए, HTTP के लिए, यह 80 होगा।
s_proto

टीसीपी

यूडीपी

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

सॉकेट संरचनाओं पर युक्तियाँ

सॉकेट एड्रेस स्ट्रक्चर हर नेटवर्क प्रोग्राम का एक अभिन्न हिस्सा है। हम उन्हें आवंटित करते हैं, उन्हें भरते हैं और उन्हें विभिन्न सॉकेट कार्यों के लिए पॉइंटर्स पास करते हैं। कभी-कभी हम इन संरचनाओं में से किसी एक सॉकेट फ़ंक्शन को पॉइंटर पास करते हैं और यह सामग्री में भर जाता है।

हम हमेशा संदर्भ द्वारा इन संरचनाओं को पास करते हैं (यानी, हम संरचना के लिए एक संकेतक पास करते हैं, न कि संरचना ही), और हम हमेशा संरचना के आकार को एक अन्य तर्क के रूप में पास करते हैं।

जब एक सॉकेट फ़ंक्शन किसी संरचना में भरता है, तो लंबाई भी संदर्भ द्वारा पारित की जाती है, ताकि फ़ंक्शन द्वारा इसके मूल्य को अपडेट किया जा सके। हम इन मूल्य-परिणाम तर्कों को कहते हैं।

हमेशा, बेज़ेरो () फ़ंक्शन के लिए मेमसेट () का उपयोग करके संरचना चर को NULL (यानी, '\ 0') पर सेट करें, अन्यथा यह आपकी संरचना में अनपेक्षित रद्दी मान प्राप्त कर सकता है।