बर्कले सॉकेट

From Vigyanwiki

बर्कले सॉकेट्स इंटरनेट सॉकेट और यूनिक्स डोमेन सॉकेट के लिए अप्लिकेशन प्रोग्रामिंग अंतरफलक (एपीआई) है, जिसका प्रयोग अंतःप्रक्रम संचार (आईपीसी) के लिए किया जाता है। यह सामान्यतः लिंक करने योग्य मॉड्यूल के पुस्तकालय (कंप्यूटिंग) के रूप में कार्यान्वित किया जाता है। इसका प्रारंभ बर्कले सॉफ्टवेयर वितरण 4.2 बीएसडी यूनिक्स ऑपरेटिंग प्रणाली के इतिहास से हुई, जिसे 1983 में प्रयुक्त किया गया था।

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

बर्कले सॉकेट वास्तविक मानक से थोड़ा संशोधन के साथ विकसित हुए हैं।वास्तविक मानक पॉज़िक्स विनिर्देश के घटक में पॉज़िक्स सॉकेट्स शब्द अनिवार्य रूप से 'बर्कले सॉकेट्स' का पर्याय है, लेकिन उन्हें बीएसडी सॉकेट्स के रूप में भी जाना जाता है, जो बर्कले सॉफ्टवेयर वितरण में पहले कार्यान्वयन को स्वीकार करते हैं।

इतिहास और कार्यान्वयन

बर्कले सॉकेट्स की उत्पत्ति 4.2बीएसडी यूनिक्स ऑपरेटिंग प्रणाली के साथ हुई, जिसे 1983 में प्रोग्रामिंग इंटरफेस के रूप में प्रयुक्त किया गया था। चूँकि, 1989 तक, कैलिफोर्निया विश्वविद्यालय, बर्कले ऑपरेटिंग प्रणाली और नेटवर्किंग लाइब्रेरी के संस्करणों को AT&T कॉर्पोरेशन के स्वामित्व वाली यूनिक्स की लाइसेंसिंग बाधाओं से मुक्त नहीं कर सका।

सभी आधुनिक ऑपरेटिंग प्रणाली बर्कले सॉकेट इंटरफ़ेस के संस्करण को प्रयुक्त करते हैं। यह इंटरनेट में चल रहे अनुप्रयोगों के लिए मानक इंटरफ़ेस बन गया। यहां तक ​​कि असंबद्ध डेवलपर्स द्वारा बनाए गए एमएस विंडोज के लिए विनसॉक कार्यान्वयन भी मानक का निकट से से पालन करता है।

बीएसडी सॉकेट एपीआई सी (प्रोग्रामिंग भाषा) में लिखा गया है। अधिकांश अन्य प्रोग्रामिंग भाषा समान इंटरफेस प्रदान करती हैं, जिन्हें सामान्यतः C API पर आधारित रैपर लाइब्रेरी के रूप में लिखा जाता है।[1]


बीएसडी और पॉज़िक्स सॉकेट

जैसा कि बर्कले सॉकेट एपीआई विकसित हुआ और अंततः पॉज़िक्स सॉकेट एपीआई निकला,[2] कुछ कार्यों को बहिष्कृत या हटा दिया गया और अन्य द्वारा प्रतिस्थापित किया गया। पॉज़िक्स API को भी पुनर्वित्त (कंप्यूटिंग) के लिए डिज़ाइन किया गया है और IPv6 का समर्थन करता है।

कार्रवाई बीएसडी पॉज़िक्स
टेक्स्ट एड्रेस से पैक्ड एड्रेस में रूपांतरण inet_aton inet_pton
पैक किए गए पते से टेक्स्ट पते में रूपांतरण inet_ntoa inet_ntop
आयोजकों नाम/सेवा के लिए फॉरवर्ड लुकअप gethostbyname, gethostbyaddr, getservbyname, getservbyport getaddrinfo
आयोजकों नाम/सेवा के लिए रिवर्स लुकअप gethostbyaddr, getservbyport getnameinfo


विकल्प

स्ट्रीम (नेटवर्किंग एपीआई) आधारित ट्रांसपोर्ट लेयर इंटरफ़ेस (टीएलआई) एपीआई सॉकेट एपीआई के लिए विकल्प प्रदान करता है। टीएलआई एपीआई प्रदान करने वाली कई प्रणालियां बर्कले सॉकेट एपीआई भी प्रदान करती हैं।

गैर-यूनिक्स प्रणाली अधिकांशतः बर्कले सॉकेट एपीआई को अनुवाद परत के साथ मूल नेटवर्किंग एपीआई में साक्ष्य करते हैं। बेल लैब्स से प्लान 9[3] और जीनोड[4] फाइल-डिस्क्रिप्टर के अतिरिक्त नियंत्रण फाइलों के साथ फाइल-प्रणाली एपीआई का उपयोग करें।

हैडर फ़ाइलें

बर्कले सॉकेट इंटरफ़ेस को कई शीर्षलेख फ़ाइलों में परिभाषित किया गया है। कार्यान्वयन के बीच इन फ़ाइलों के नाम और सामग्री थोड़ी भिन्न होती है। सामान्यतः, इनमें सम्मिलित हैं:

फाइल विवरण
sys/socket.h कोर सॉकेट फलन और डेटा संरचनाएं।
netinet/in.h AF_INET and AF_INET6 फैमली और उनके संबंधित प्रोटोकॉल फैमली को संबोधित करें, PF_INET and PF_INET6. इनमें मानक आईपी पते और टीसीपी और यूडीपी पोर्ट नंबर सम्मिलित हैं।
sys/un.h PF_UNIX and PF_LOCAL एड्रेस फैमली एक ही कंप्यूटर पर चल रहे प्रोग्रामों के बीच स्थानीय संचार के लिए उपयोग किया जाता है।
arpa/inet.h संख्यात्मक आईपी पतों में हेरफेर करने के लिए कार्य
netdb.h प्रोटोकॉल नामों और होस्ट नामों को संख्यात्मक पतों में अनुवाद करने के लिए कार्य। स्थानीय डेटा के साथ-साथ नाम सेवाओं की खोज करता है।


सॉकेट एपीआई फलन

ट्रांसमिशन कंट्रोल प्रोटोकॉल (टीसीपी) के साथ सॉकेट का उपयोग कर क्लाइंट-सर्वर लेनदेन का प्रवाह आरेख।

बर्कले सॉकेट एपीआई सामान्यतः निम्नलिखित कार्य प्रदान करता है:

  • सॉकेट () निश्चित प्रकार का नया सॉकेट बनाता है, जिसे पूर्णांक संख्या द्वारा पहचाना जाता है, और इसके लिए प्रणाली संसाधन आवंटित करता है।
  • बाइंड () सामान्यतः सर्वर साइड पर उपयोग किया जाता है, और सॉकेट को सॉकेट एड्रेस संरचना, यानी निर्दिष्ट स्थानीय आईपी एड्रेस और पोर्ट नंबर के साथ जोड़ता है।
  • सुनो () सर्वर साइड पर उपयोग किया जाता है, और बाध्य टीसीपी सॉकेट को लिसेन की स्थिति में प्रवेश करने का कारण बनता है।
  • कनेक्ट() क्लाइंट साइड पर प्रयोग किया जाता है, और सॉकेट को मुफ्त स्थानीय पोर्ट नंबर असाइन करता है। टीसीपी सॉकेट के स्थितियों में, यह नया टीसीपी कनेक्शन स्थापित करने का प्रयास करता है।
  • स्वीकार करें () का उपयोग सर्वर साइड पर किया जाता है। यह रिमोट क्लाइंट से नया टीसीपी कनेक्शन बनाने के लिए आने वाले प्रयास को स्वीकार करता है, और इस कनेक्शन के सॉकेट एड्रेस जोड़ी से जुड़ा नया सॉकेट बनाता है।
  • सेंड (), आरईवी (), सेंडटो (), और रिकवफ्रॉम () का उपयोग डेटा भेजने और प्राप्त करने के लिए किया जाता है। मानक फलन राइट () और रीड () का भी उपयोग किया जा सकता है।
  • बंद () प्रणाली को सॉकेट के लिए आवंटित संसाधनों को प्रयुक्त करने का कारण बनता है। टीसीपी के स्थितियों में, कनेक्शन समाप्त कर दिया गया है।
  • gethostbyname() और gethostbyaddr() का उपयोग आयोजकों नाम और पते को हल करने के लिए किया जाता है। IPv4 केवल।
  • getaddrinfo() और freeaddrinfo() का उपयोग आयोजकों नाम और पते को हल करने के लिए किया जाता है। IPv4, IPv6.
  • चयन () का उपयोग निलंबित करने के लिए किया जाता है, सॉकेट्स की एक या अधिक प्रदान की गई सूची को पढ़ने के लिए तैयार होने, लिखने के लिए तैयार होने या त्रुटियों के लिए प्रतीक्षा करने के लिए।
  • पोल () का उपयोग सॉकेट के सेट में सॉकेट की स्थिति की जांच के लिए किया जाता है। यह देखने के लिए सेट का परीक्षण किया जा सकता है कि क्या कोई सॉकेट लिखा जा सकता है, पढ़ा जा सकता है या कोई त्रुटि हुई है या नहीं।
  • getockopt() निर्दिष्ट सॉकेट के लिए किसी विशेष सॉकेट विकल्प के वर्तमान मान को पुनर्प्राप्त करने के लिए उपयोग किया जाता है।
  • setockopt() निर्दिष्ट सॉकेट के लिए विशेष सॉकेट विकल्प सेट करने के लिए प्रयोग किया जाता है।

सॉकेट

फलन सॉकेट () संचार के लिए समापन बिंदु बनाता है और सॉकेट के लिए फ़ाइल डिस्क्रिप्टर देता है। यह तीन तर्कों का उपयोग करता है:

  • domain, जो निर्मित सॉकेट के प्रोटोकॉल परिवार को निर्दिष्ट करता है। उदाहरण के लिए:
    • AF_INET नेटवर्क प्रोटोकॉल IPv4 के लिए (केवल IPv4)
    • AF_INET6 IPv6 के लिए (और कुछ स्थितियों में, IPv4 के साथ पिछड़ा संगत)
    • AF_UNIX स्थानीय सॉकेट के लिए ( विशेष फाइलप्रणाली नोड का उपयोग करके)
  • type, में से एक:
    • SOCK_STREAM (विश्वसनीय स्ट्रीम-उन्मुख सेवा या स्ट्रीम सॉकेट)
    • SOCK_DGRAM (डेटाग्राम सेवा या डेटाग्राम सॉकेट)
    • SOCK_SEQPACKET (विश्वसनीय अनुक्रमित पैकेट सेवा)
    • SOCK_RAW (नेटवर्क परत के ऊपर अपरिष्कृत प्रोटोकॉल)
  • protocol उपयोग करने के लिए वास्तविक परिवहन प्रोटोकॉल निर्दिष्ट करना। सबसे आम हैं ट्रांसमिशन कंट्रोल प्रोटोकॉल |IPPROTO_TCP,IPPROTO_SCTP,|IPPROTO_UDP,IPPROTO_DCCP. ये प्रोटोकॉल फ़ाइल netinet/in.h में निर्दिष्ट हैं। मूल्य 0 का उपयोग चयनित डोमेन और प्रकार से डिफ़ॉल्ट प्रोटोकॉल का चयन करने के लिए किया जा सकता है।

फलन लौटता है -1 अगर कोई त्रुटि हुई। अन्यथा, यह नए असाइन किए गए डिस्क्रिप्टर का प्रतिनिधित्व करने वाला पूर्णांक देता है।

बाइंड

बाइंड () सॉकेट को पते से जोड़ता है। जब सॉकेट() के साथ सॉकेट बनाया जाता है, तो इसे केवल प्रोटोकॉल परिवार दिया जाता है, लेकिन कोई पता नहीं दिया जाता है। सॉकेट अन्य आयोजकों से कनेक्शन स्वीकार कर सकता है इससे पहले यह सहयोग किया जाना चाहिए। फलन में तीन तर्क हैं:

  • sockfd, सॉकेट का प्रतिनिधित्व करने वाला विवरणक।
  • my_addr, sockaddr संरचना के लिए संकेतक जो बाइंड किए जाने वाले पते का प्रतिनिधित्व करता है।
  • addrlen, sockaddr संरचना के आकार को निर्दिष्ट करने वाले socklen_t प्रकार का क्षेत्र।

बाइंड () सफलता पर 0 और -1 त्रुटि होने पर रिटर्न देता है।

लिसेन

सॉकेट को पते से जोड़ने के बाद, listen() इसे इनकमिंग कनेक्शन के लिए तैयार करता है। चूँकि, यह केवल स्ट्रीम-ओरिएंटेड (कनेक्शन-ओरिएंटेड) डेटा मोड के लिए आवश्यक है, यानी, सॉकेट प्रकार (SOCK_STREAM, SOCK_SEQPACKET) के लिए। listen() को दो तर्कों की आवश्यकता है:

  • sockfd, मान्य सॉकेट डिस्क्रिप्टर।
  • बैकलॉग, लंबित कनेक्शनों की संख्या का प्रतिनिधित्व करने वाला पूर्णांक जिसे किसी भी समय कतारबद्ध किया जा सकता है। ऑपरेटिंग प्रणाली सामान्यतः इस मान पर कैप लगाता है।

एक बार कनेक्शन स्वीकार कर लेने के बाद, इसे हटा दिया जाता है। सफल होने पर, 0 लौटाया जाता है। यदि कोई त्रुटि होती है, तो -1 वापस आ जाता है।

स्वीकार करें

जब कोई एप्लिकेशन अन्य आयोजकों से स्ट्रीम-ओरिएंटेड कनेक्शन के लिए सुन रहा होता है, तो उसे ऐसी घटनाओं के बारे में सूचित किया जाता है (cf. सेलेक्ट (यूनिक्स) | सेलेक्ट () फलन) और फलन स्वीकार () का उपयोग करके कनेक्शन को प्रारंभिककरण करना चाहिए। यह प्रत्येक कनेक्शन के लिए नया सॉकेट बनाता है और कनेक्शन को लिसेन की कतार से हटा देता है। फलन में निम्नलिखित तर्क हैं:

  • sockfd, लिसनिंग सॉकेट का डिस्क्रिप्टर जिसमें कनेक्शन कतारबद्ध है।
  • cliaddr, क्लाइंट के पते की जानकारी प्राप्त करने के लिए sockaddr संरचना का सूचक।
  • addrlen, socklen_t स्थान के लिए सूचक जो स्वीकार करने के लिए पास किए गए क्लाइंट पता संरचना के आकार को निर्दिष्ट करता है ()। जब स्वीकार () रिटर्न होता है, तो इस स्थान में संरचना का आकार (बाइट्स में) होता है।

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

डेटाग्राम सॉकेट्स को स्वीकार () द्वारा प्रसंस्करण की आवश्यकता नहीं होती है क्योंकि रिसीवर तुरंत लिसेन वाले सॉकेट का उपयोग करके अनुरोध का उत्तर दे सकता है।

कनेक्ट करें

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

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

कनेक्ट () त्रुटि कोड का प्रतिनिधित्व करने वाला पूर्णांक देता है: 0 सफलता का प्रतिनिधित्व करता है, जबकि -1 त्रुटि का प्रतिनिधित्व करता है। ऐतिहासिक रूप से, बीएसडी-व्युत्पन्न प्रणालियों में, सॉकेट डिस्क्रिप्टर की स्थिति अपरिभाषित होती है यदि कनेक्ट करने के लिए कॉल विफल हो जाती है (जैसा कि यह एकल यूनिक्स विशिष्टता में निर्दिष्ट है), इस प्रकार, पोर्टेबल एप्लिकेशन को सॉकेट डिस्क्रिप्टर को तुरंत बंद करना चाहिए और नया डिस्क्रिप्टर प्राप्त करना चाहिए सॉकेट (), स्थितियों में कनेक्ट करने के लिए कॉल () विफल रहता है।[5]

gethostbyname और gethostbyaddr

कार्य gethostbyname() और gethostbyaddr() का उपयोग डोमेन की नामांकन प्रणाली या स्थानीय आयोजकों के अन्य रिज़ॉल्वर तंत्र (जैसे, /etc/hosts लुकअप) में आयोजकों नाम और पते को हल करने के लिए किया जाता है। वे संरचना आयोजकों प्रकार के ऑब्जेक्ट के लिए पॉइंटर लौटाते हैं, जो इंटरनेट प्रोटोकॉल आयोजकों का वर्णन करता है। कार्य निम्नलिखित तर्कों का उपयोग करते हैं:

  • name आयोजकों का नाम निर्दिष्ट करता है।
  • addr आयोजकों के पते वाले struct in_addr के लिए संकेतक निर्दिष्ट करता है।
  • len addr की बाइट्स में लंबाई निर्दिष्ट करता है।
  • type आयोजकों पते का पता परिवार प्रकार (उदा., AF_INET) निर्दिष्ट करता है।

त्रुटि के स्थितियों में फलन पूर्ण सूचक लौटाता है, जिस स्थिति में बाहरी पूर्णांक होता है h_errno को यह देखने के लिए चेक किया जा सकता है कि यह अस्थायी विफलता है या अमान्य या अज्ञात आयोजकों है। अन्यथा वैध struct hostent * दिया जाता है।

ये फलन सख्ती से बीएसडी सॉकेट एपीआई का घटक नहीं हैं, लेकिन अधिकांशतः आयोजकों को देखने के लिए एपीआई फलन के साथ संयोजन में उपयोग किया जाता है। डोमेन नेम प्रणाली को क्वेरी करने के लिए इन कार्यों को अब लीगेसी इंटरफेस माना जाता है। नए कार्य जो पूरी तरह से प्रोटोकॉल-अज्ञेयवादी हैं (IPv6 का समर्थन करते हैं) परिभाषित किए गए हैं। ये नए कार्य [getaddrinfo]]|getaddrinfo() और getnameinfo() हैं, और नई Addrinfo डेटा संरचना पर आधारित हैं।[6]

कार्यों की यह जोड़ी 4.2बीएसडी (1983) में बीएसडी सॉकेट एपीआई के रूप में एक ही समय में दिखाई दी,[7] उसी वर्ष डीएनएस पहली बार बनाया गया था। प्रारंभी संस्करणों ने डीएनएस को क्वेरी नहीं किया और केवल /etc/hosts लुकअप किया। 4.3बीएसडी (1984) संस्करण ने डीएनएस को कच्चे विधियों से जोड़ा जाता है। नाम सेवा स्विच का उपयोग करने वाला वर्तमान कार्यान्वयन सोलारिस और बाद में Netबीएसडी 1.4 (1999) को प्राप्त करता है।[8] प्रारंभ में एनआईएस+ के लिए परिभाषित, एनएसएस डीएनएस को इन कार्यों द्वारा देखने के लिए कई विकल्पों में से केवल एक बनाता है और इसका उपयोग आज भी अक्षम किया जा सकता है।[9]


प्रोटोकॉल और एड्रेस फैमली

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

निम्नलिखित आधुनिक लिनक्स या बीएसडी कार्यान्वयन में परिभाषित प्रोटोकॉल परिवारों (मानक प्रतीकात्मक पहचानकर्ता से पहले) का नमूना सूचीबद्ध करता है:

पहचानकर्ता कार्य या प्रयोग
PF_APPLETALK एप्पलटॉक
PF_ATMPVC अतुल्यकालिक स्थानांतरण मोड स्थायी वर्चुअल सर्किट
PF_ATMSVC एसिंक्रोनस ट्रांसफर मोड स्विच्ड वर्चुअल सर्किट
PF_AX25 एमेच्योर रेडियो AX.25
PF_BLUETOOTH ब्लूटूथ सॉकेट
PF_BRIDGE मल्टीप्रोटोकॉल ब्रिज
PF_DECnet DECnet परियोजना के लिए आरक्षित
PF_ECONET Acorn Econet
PF_INET इंटरनेट प्रोटोकॉल संस्करण 4
PF_INET6 इंटरनेट प्रोटोकॉल संस्करण 6
PF_IPX नोवेल का इंटरनेटवर्क पैकेट एक्सचेंज
PF_IRDA आईआरडीए सॉकेट
PF_KEY PF_KEY कुंजी प्रबंधन एपीआई
PF_LOCAL, PF_UNIX, PF_FILE होस्ट करने के लिए स्थानीय (पाइप और फ़ाइल-डोमेन)
PF_NETROM एमेच्योर रेडियो नेट/रोम (AX.25 से संबंधित)[10]
PF_NETBEUI 802.2 एलएलसी परियोजना के लिए आरक्षित
PF_SECURITY सुरक्षा कॉलबैक स्यूडो एएफ
PF_NETLINK, PF_ROUTE रूटिंग एपीआई
PF_PACKET पैकेट कैप्चर सॉकेट
PF_PPPOX पीपीपी एक्स सॉकेट पर
PF_SNA लिनक्स सिस्टम नेटवर्क आर्किटेक्चर (एसएनए) प्रोजेक्ट
PF_WANPIPE सांगोमा वानपाइप एपीआई सॉकेट

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

चूँकि, प्रोटोकॉल और पता प्रकार को अलग करने की इस अवधारणा को कार्यान्वयन समर्थन नहीं मिला है और AF-स्थिरांक को संबंधित प्रोटोकॉल पहचानकर्ता द्वारा परिभाषित किया गया था, जिसके बीच अंतर छोड़ दिया गया था AF और PF कोई व्यावहारिक परिणाम के तकनीकी तर्क के रूप में स्थिरांक सही सही, दोनों रूपों के उचित उपयोग में काफी भ्रम उपस्थित है।[11]

पॉज़िक्स.1—2008 विनिर्देश कोई निर्दिष्ट नहीं करता है PF-स्थिरांक, लेकिन केवल AF-स्थिरांक[12]


कच्चे सॉकेट

कच्चे सॉकेट सरल इंटरफ़ेस प्रदान करते हैं जो आयोजकों के टीसीपी/आईपी स्टैक द्वारा प्रसंस्करण को बायपास करता है। वे उपयोगकर्ता स्थान में नेटवर्किंग प्रोटोकॉल के कार्यान्वयन की अनुमति देते हैं और प्रोटोकॉल स्टैक के डिबगिंग में सहायता करते हैं।[13] कच्चे सॉकेट का उपयोग कुछ सेवाओं द्वारा किया जाता है, जैसे कि इंटरनेट नियंत्रण संदेश प्रोटोकॉल, जो टीसीपी/आईपी मॉडल के इंटरनेट परत पर काम करता है।

अवरुद्ध और गैर-अवरुद्ध मोड

बर्कले सॉकेट दो मोड में से एक में काम कर सकता है: अवरोधन (कंप्यूटिंग) या गैर-अवरुद्ध

अवरुद्ध सॉकेट तब तक नियंत्रण वापस नहीं करता जब तक कि उसने ऑपरेशन के लिए निर्दिष्ट कुछ या सभी डेटा नहीं भेजे (या प्राप्त किए)। अवरुद्ध सॉकेट के लिए सभी डेटा नहीं भेजना सामान्य है। कितने बाइट भेजे या प्राप्त किए गए हैं यह निर्धारित करने के लिए एप्लिकेशन को वापसी मूल्य की जांच करनी चाहिए और इसे पहले से संसाधित नहीं किए गए किसी भी डेटा को फिर से भेजना चाहिए।[14] अवरुद्ध सॉकेट्स का उपयोग करते समय, स्वीकार करने के लिए विशेष ध्यान दिया जाना चाहिए () क्योंकि यह पठनीयता का संकेत देने के बाद भी ब्लॉक हो सकता है यदि क्लाइंट कनेक्शन चरण के समय डिस्कनेक्ट हो जाता है।

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

सॉकेट सामान्यतः fcntl और ioctl फलन का उपयोग करके अवरुद्ध या गैर-अवरुद्ध मोड पर सेट होता है।

समाप्ति सॉकेट

सॉकेट बंद होने तक ऑपरेटिंग प्रणाली सॉकेट को आवंटित संसाधनों को प्रयुक्त नहीं करता है। यह विशेष रूप से महत्वपूर्ण है यदि कनेक्ट कॉल विफल हो जाती है और पुनः प्रयास किया जाएगा।

जब कोई एप्लिकेशन सॉकेट को बंद करता है, तो केवल सॉकेट का इंटरफ़ेस नष्ट हो जाता है। सॉकेट को आंतरिक रूप से नष्ट करना कर्नेल की जिम्मेदारी है। कभी-कभी, सॉकेट a में प्रवेश कर सकता है TIME_WAIT स्टेट, सर्वर साइड पर, 4 मिनट तक होता है।[15]

SVR4 प्रणाली पर इसका उपयोग close() डेटा छोड़ सकता है। का उपयोग shutdown() या SO_LINGER सभी डेटा के वितरण की गारंटी के लिए इन प्रणालीों पर आवश्यक हो सकता है।[16]



टीसीपी का उपयोग कर क्लाइंट-सर्वर उदाहरण

प्रसारण नियंत्रण प्रोटोकॉल (टीसीपी) कनेक्शन-उन्मुख संचार कनेक्शन-उन्मुख प्रोटोकॉल है जो बाइट स्ट्रीम के प्रसारण के लिए विभिन्न प्रकार के त्रुटि सुधार और प्रदर्शन सुविधाएँ प्रदान करता है। प्रक्रिया कॉल करके टीसीपी सॉकेट बनाती है socket() प्रोटोकॉल परिवार के लिए मापदंडों के साथ कार्य करता है (PF INET, PF_INET6), स्ट्रीम सॉकेट के लिए सॉकेट मोड (SOCK_STREAM), और टीसीपी के लिए आईपी प्रोटोकॉल पहचानकर्ता (IPPROTO_TCP) है।

सर्वर

टीसीपी सर्वर की स्थापना में निम्नलिखित मूलभूत कदम सम्मिलित हैं:

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

निम्न प्रोग्राम पोर्ट नंबर 1100 पर लिसेन वाला टीसीपी सर्वर बनाता है:

  #include <sys/types.h>
  #include <sys/socket.h>
  #include <netinet/in.h>
  #include <arpa/inet.h>
  #include <stdio.h>
  #include <stdlib.h>
  #include <string.h>
  #include <unistd.h>
  
  int main(void)
  {
    struct sockaddr_in sa;
    int SocketFD = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (SocketFD == -1) {
      perror("cannot create socket");
      exit(EXIT_FAILURE);
    }
  
    memset(&sa, 0, sizeof sa);
  
    sa.sin_family = AF_INET;
    sa.sin_port = htons(1100);
    sa.sin_addr.s_addr = htonl(INADDR_ANY);
  
    if (bind(SocketFD,(struct sockaddr *)&sa, sizeof sa) == -1) {
      perror("bind failed");
      close(SocketFD);
      exit(EXIT_FAILURE);
    }
  
    if (listen(SocketFD, 10) == -1) {
      perror("listen failed");
      close(SocketFD);
      exit(EXIT_FAILURE);
    }
  
    for (;;) {
      int ConnectFD = accept(SocketFD, NULL, NULL);
  
      if (ConnectFD == -1) {
        perror("accept failed");
        close(SocketFD);
        exit(EXIT_FAILURE);
      }
  
      /* perform read write operations ... 
      read(ConnectFD, buff, size)
      */
  
      if (shutdown(ConnectFD, SHUT_RDWR) == -1) {
        perror("shutdown failed");
        close(ConnectFD);
        close(SocketFD);
        exit(EXIT_FAILURE);
      }
      close(ConnectFD);
    }

    close(SocketFD);
    return EXIT_SUCCESS;  
}


क्लाइंट

टीसीपी क्लाइंट एप्लिकेशन प्रोग्रामिंग में निम्नलिखित कदम सम्मिलित हैं:

  • टीसीपी सॉकेट बनाना।
  • सर्वर से कनेक्ट करना (कनेक्ट ()), एक पास करके sockaddr_in के साथ संरचना sin_family करने के लिए सेट AF_INET, sin_port पोर्ट पर सेट करें समापन बिंदु सुन रहा है (नेटवर्क बाइट ऑर्डर में), और sin_addr लिसेन वाले सर्वर के आईपी पते पर सेट करें (नेटवर्क बाइट ऑर्डर में भी)।
  • एपीआई फलन सेंड () और आरईवी () के साथ-साथ सामान्य-उद्देश्य फलन राइट () और रीड () के साथ रिमोट आयोजकों के साथ संचार करना होता है।
  • फलन क्लोज () के साथ उपयोग के बाद खोले गए प्रत्येक सॉकेट को बंद करना।
  #include <sys/types.h>
  #include <sys/socket.h>
  #include <netinet/in.h>
  #include <arpa/inet.h>
  #include <stdio.h>
  #include <stdlib.h>
  #include <string.h>
  #include <unistd.h>
  
  int main(void)
  {
    struct sockaddr_in sa;
    int res;
    int SocketFD;

    SocketFD = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (SocketFD == -1) {
      perror("cannot create socket");
      exit(EXIT_FAILURE);
    }
  
    memset(&sa, 0, sizeof sa);
  
    sa.sin_family = AF_INET;
    sa.sin_port = htons(1100);
    res = inet_pton(AF_INET, "192.168.1.3", &sa.sin_addr);

    if (connect(SocketFD, (struct sockaddr *)&sa, sizeof sa) == -1) {
      perror("connect failed");
      close(SocketFD);
      exit(EXIT_FAILURE);
    }
  
    /* perform read write operations ... */
  
    close(SocketFD);
    return EXIT_SUCCESS;
  }


यूडीपी का उपयोग कर क्लाइंट-सर्वर उदाहरण

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

यूडीपी एड्रेस स्पेस, यूडीपी पोर्ट नंबरों का स्पेस (ISO शब्दावली में, TSAPs), TCP पोर्ट्स से पूरी तरह से अलग है।

सर्वर

एप्लिकेशन निम्नानुसार पोर्ट नंबर 7654 पर यूडीपी सर्वर स्थापित कर सकता है। प्रोग्राम में अनंत लूप होता है जो फलन recvfrom () के साथ यूडीपी डेटाग्राम प्राप्त करता है।

#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <unistd.h> /* for close() for socket */ 
#include <stdlib.h>

int main(void)
{
  int sock;
  struct sockaddr_in sa; 
  char buffer[1024];
  ssize_t recsize;
  socklen_t fromlen;

  memset(&sa, 0, sizeof sa);
  sa.sin_family = AF_INET;
  sa.sin_addr.s_addr = htonl(INADDR_ANY);
  sa.sin_port = htons(7654);
  fromlen = sizeof sa;

  sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
  if (bind(sock, (struct sockaddr *)&sa, sizeof sa) == -1) {
    perror("error bind failed");
    close(sock);
    exit(EXIT_FAILURE);
  }

  for (;;) {
    recsize = recvfrom(sock, (void*)buffer, sizeof buffer, 0, (struct sockaddr*)&sa, &fromlen);
    if (recsize < 0) {
      fprintf(stderr, "%s\n", strerror(errno));
      exit(EXIT_FAILURE);
    }
    printf("recsize: %d\n ", (int)recsize);
    sleep(1);
    printf("datagram: %.*s\n", (int)recsize, buffer);
  }
}

क्लाइंट

यूडीपी पैकेट भेजने के लिए निम्न क्लाइंट प्रोग्राम है जिसमें स्ट्रिंग हैलो वर्ल्ड! पोर्ट नंबर 7654 पर 127.0.0.1 को संबोधित करने के लिए।

#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <unistd.h>
#include <arpa/inet.h>

int main(void)
{
  int sock;
  struct sockaddr_in sa;
  int bytes_sent;
  char buffer[200];
 
  strcpy(buffer, "hello world!");
 
  /* create an Internet, datagram, socket using UDP */
  sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
  if (sock == -1) {
      /* if socket failed to initialize, exit */
      printf("Error Creating Socket");
      exit(EXIT_FAILURE);
  }
 
  /* Zero out socket address */
  memset(&sa, 0, sizeof sa);
  
  /* The address is IPv4 */
  sa.sin_family = AF_INET;
 
   /* IPv4 addresses is a uint32_t, convert a string representation of the octets to the appropriate value */
  sa.sin_addr.s_addr = inet_addr("127.0.0.1");
  
  /* sockets are unsigned shorts, htons(x) ensures x is in network byte order, set the port to 7654 */
  sa.sin_port = htons(7654);
 
  bytes_sent = sendto(sock, buffer, strlen(buffer), 0,(struct sockaddr*)&sa, sizeof sa);
  if (bytes_sent < 0) {
    printf("Error sending packet: %s\n", strerror(errno));
    exit(EXIT_FAILURE);
  }
 
  close(sock); /* close the socket */
  return 0;
}


इस कोड में, बफ़र भेजे जाने वाले डेटा के लिए संकेतक है, और बफ़र_लेंथ डेटा के आकार को निर्दिष्ट करता है।

संदर्भ

  1. E. g. in the Ruby programming language ruby-doc::Socket
  2. "— POSIX.1-2008 specification". Opengroup.org. Retrieved 2012-07-26.
  3. "The Organization of Networks in Plan 9".
  4. "Linux TCP/IP stack as VFS plugin".
  5. Stevens & Rago 2013, p. 607.
  6. POSIX.1-2004
  7. gethostbyname(3) – FreeBSD Library Functions Manual
  8. Conill, Ariadne (March 27, 2022). "gethostbyname की त्रासदी". ariadne.space.
  9. nsswitch.conf(5) – FreeBSD File Formats Manual
  10. https://manpages.debian.org/experimental/ax25-tools/netrom.4.en.html. {{cite web}}: Missing or empty |title= (help)
  11. UNIX Network Programming Volume 1, Third Edition: The Sockets Networking API, W. Richard Stevens, Bill Fenner, Andrew M. Rudoff, Addison Wesley, 2003.
  12. "The Open Group Base Specifications Issue 7". Pubs.opengroup.org. Retrieved 2012-07-26.
  13. "TCP/IP raw sockets - Win32 apps".
  14. "बीज की नेटवर्क प्रोग्रामिंग के लिए गाइड". Beej.us. 2007-05-05. Retrieved 2012-07-26.
  15. "समापन सॉकेट". Softlab.ntua.gr. Retrieved 2012-07-26.
  16. "ntua.gr - Programming UNIX Sockets in C - Frequently Asked Questions: Questions regarding both Clients and Servers (TCP/SOCK_STREAM)". Softlab.ntua.gr. Retrieved 2012-07-26.

The de jure standard definition of the Sockets interface is contained in the पॉज़िक्स standard, known as:

  • IEEE Std. 1003.1-2001 Standard for Information Technology—Portable Operating System Interface (पॉज़िक्स).
  • Open Group Technical Standard: Base Specifications, Issue 6, December 2001.
  • ISO/IEC 9945:2002

Information about this standard and ongoing work on it is available from the Austin website.

The IPv6 extensions to the base socket API are documented in RFC 3493 and RFC 3542.


बाहरी संबंध