बर्कले सॉकेट: Difference between revisions

From Vigyanwiki
No edit summary
No edit summary
Line 1: Line 1:
{{Short description|Inter-process communication API}}
{{Short description|Inter-process communication API}}


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


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


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


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


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


बीएसडी सॉकेट एपीआई [[सी (प्रोग्रामिंग भाषा)]] में लिखा गया है। अधिकांश अन्य प्रोग्रामिंग भाषा समान इंटरफेस प्रदान करती हैं, जिन्हें सामान्यतः C API पर आधारित [[रैपर लाइब्रेरी]] के रूप में लिखा जाता है।<ref>E. g. in the [[Ruby (programming language)|Ruby programming language]] [http://www.ruby-doc.org/stdlib-1.9.3/libdoc/socket/rdoc/Socket.html ruby-doc::Socket]</ref>
बीएसडी सॉकेट एपीआई [[सी (प्रोग्रामिंग भाषा)]] में लिखा गया है। अधिकांश अन्य प्रोग्रामिंग भाषा समान इंटरफेस प्रदान करती हैं, जिन्हें सामान्यतः C API पर आधारित [[रैपर लाइब्रेरी]] के रूप में लिखा जाता है।<ref>E. g. in the [[Ruby (programming language)|Ruby programming language]] [http://www.ruby-doc.org/stdlib-1.9.3/libdoc/socket/rdoc/Socket.html ruby-doc::Socket]</ref>
Line 43: Line 43:


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


गैर-यूनिक्स प्रणाली अधिकांशतः बर्कले सॉकेट एपीआई को अनुवाद परत के साथ मूल नेटवर्किंग एपीआई में साक्ष्य करते हैं। [[बेल लैब्स से प्लान 9]]<ref>{{cite web|url=http://doc.cat-v.org/plan_9/4th_edition/papers/net/|title=The Organization of Networks in Plan 9}}</ref> और [[जीनोड]]<ref>{{cite web|url=https://genode.org/documentation/release-notes/17.02#Linux_TCP_IP_stack_as_VFS_plugin|title=Linux TCP/IP stack as VFS plugin}}</ref> फाइल-डिस्क्रिप्टर के अतिरिक्त नियंत्रण फाइलों के साथ फाइल-प्रणाली एपीआई का उपयोग करें।
गैर-यूनिक्स प्रणाली अधिकांशतः बर्कले सॉकेट एपीआई को अनुवाद परत के साथ मूल नेटवर्किंग एपीआई में साक्ष्य करते हैं। [[बेल लैब्स से प्लान 9]]<ref>{{cite web|url=http://doc.cat-v.org/plan_9/4th_edition/papers/net/|title=The Organization of Networks in Plan 9}}</ref> और [[जीनोड]]<ref>{{cite web|url=https://genode.org/documentation/release-notes/17.02#Linux_TCP_IP_stack_as_VFS_plugin|title=Linux TCP/IP stack as VFS plugin}}</ref> फाइल-डिस्क्रिप्टर के अतिरिक्त नियंत्रण फाइलों के साथ फाइल-प्रणाली एपीआई का उपयोग करें।
Line 66: Line 66:
== सॉकेट एपीआई फलन ==
== सॉकेट एपीआई फलन ==
[[File:InternetSocketBasicDiagram zhtw.png|thumb|right|ट्रांसमिशन कंट्रोल प्रोटोकॉल (टीसीपी) के साथ सॉकेट का उपयोग कर क्लाइंट-सर्वर लेनदेन का प्रवाह आरेख।]]बर्कले सॉकेट एपीआई सामान्यतः निम्नलिखित कार्य प्रदान करता है:
[[File:InternetSocketBasicDiagram zhtw.png|thumb|right|ट्रांसमिशन कंट्रोल प्रोटोकॉल (टीसीपी) के साथ सॉकेट का उपयोग कर क्लाइंट-सर्वर लेनदेन का प्रवाह आरेख।]]बर्कले सॉकेट एपीआई सामान्यतः निम्नलिखित कार्य प्रदान करता है:
* सॉकेट () एक निश्चित प्रकार का एक नया सॉकेट बनाता है, जिसे एक पूर्णांक संख्या द्वारा पहचाना जाता है, और इसके लिए प्रणाली संसाधन आवंटित करता है।
* सॉकेट () निश्चित प्रकार का नया सॉकेट बनाता है, जिसे पूर्णांक संख्या द्वारा पहचाना जाता है, और इसके लिए प्रणाली संसाधन आवंटित करता है।
* बाइंड () सामान्यतः सर्वर साइड पर उपयोग किया जाता है, और सॉकेट को सॉकेट एड्रेस संरचना, यानी एक निर्दिष्ट स्थानीय आईपी एड्रेस और पोर्ट नंबर के साथ जोड़ता है।
* बाइंड () सामान्यतः सर्वर साइड पर उपयोग किया जाता है, और सॉकेट को सॉकेट एड्रेस संरचना, यानी निर्दिष्ट स्थानीय आईपी एड्रेस और पोर्ट नंबर के साथ जोड़ता है।
* सुनो () सर्वर साइड पर उपयोग किया जाता है, और एक बाध्य टीसीपी सॉकेट को लिसेन की स्थिति में प्रवेश करने का कारण बनता है।
* सुनो () सर्वर साइड पर उपयोग किया जाता है, और बाध्य टीसीपी सॉकेट को लिसेन की स्थिति में प्रवेश करने का कारण बनता है।
* कनेक्ट() क्लाइंट साइड पर प्रयोग किया जाता है, और सॉकेट को एक मुफ्त स्थानीय पोर्ट नंबर असाइन करता है। टीसीपी सॉकेट के स्थितियों में, यह एक नया टीसीपी कनेक्शन स्थापित करने का प्रयास करता है।
* कनेक्ट() क्लाइंट साइड पर प्रयोग किया जाता है, और सॉकेट को मुफ्त स्थानीय पोर्ट नंबर असाइन करता है। टीसीपी सॉकेट के स्थितियों में, यह नया टीसीपी कनेक्शन स्थापित करने का प्रयास करता है।
* स्वीकार करें () का उपयोग सर्वर साइड पर किया जाता है। यह रिमोट क्लाइंट से एक नया टीसीपी कनेक्शन बनाने के लिए आने वाले प्रयास को स्वीकार करता है, और इस कनेक्शन के सॉकेट एड्रेस जोड़ी से जुड़ा एक नया सॉकेट बनाता है।
* स्वीकार करें () का उपयोग सर्वर साइड पर किया जाता है। यह रिमोट क्लाइंट से नया टीसीपी कनेक्शन बनाने के लिए आने वाले प्रयास को स्वीकार करता है, और इस कनेक्शन के सॉकेट एड्रेस जोड़ी से जुड़ा नया सॉकेट बनाता है।
* सेंड (), आरईवी (), सेंडटो (), और रिकवफ्रॉम () का उपयोग डेटा भेजने और प्राप्त करने के लिए किया जाता है। मानक फलन राइट () और रीड () का भी उपयोग किया जा सकता है।
* सेंड (), आरईवी (), सेंडटो (), और रिकवफ्रॉम () का उपयोग डेटा भेजने और प्राप्त करने के लिए किया जाता है। मानक फलन राइट () और रीड () का भी उपयोग किया जा सकता है।
* बंद () प्रणाली को सॉकेट के लिए आवंटित संसाधनों को प्रयुक्त करने का कारण बनता है। टीसीपी के स्थितियों में, कनेक्शन समाप्त कर दिया गया है।
* बंद () प्रणाली को सॉकेट के लिए आवंटित संसाधनों को प्रयुक्त करने का कारण बनता है। टीसीपी के स्थितियों में, कनेक्शन समाप्त कर दिया गया है।
Line 78: Line 78:
* पोल () का उपयोग सॉकेट के सेट में सॉकेट की स्थिति की जांच के लिए किया जाता है। यह देखने के लिए सेट का परीक्षण किया जा सकता है कि क्या कोई सॉकेट लिखा जा सकता है, पढ़ा जा सकता है या कोई त्रुटि हुई है या नहीं।
* पोल () का उपयोग सॉकेट के सेट में सॉकेट की स्थिति की जांच के लिए किया जाता है। यह देखने के लिए सेट का परीक्षण किया जा सकता है कि क्या कोई सॉकेट लिखा जा सकता है, पढ़ा जा सकता है या कोई त्रुटि हुई है या नहीं।
* getockopt() निर्दिष्ट सॉकेट के लिए किसी विशेष सॉकेट विकल्प के वर्तमान मान को पुनर्प्राप्त करने के लिए उपयोग किया जाता है।
* getockopt() निर्दिष्ट सॉकेट के लिए किसी विशेष सॉकेट विकल्प के वर्तमान मान को पुनर्प्राप्त करने के लिए उपयोग किया जाता है।
* setockopt() निर्दिष्ट सॉकेट के लिए एक विशेष सॉकेट विकल्प सेट करने के लिए प्रयोग किया जाता है।
* setockopt() निर्दिष्ट सॉकेट के लिए विशेष सॉकेट विकल्प सेट करने के लिए प्रयोग किया जाता है।


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


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


=== बाइंड ===
=== बाइंड ===
बाइंड () एक सॉकेट को एक पते से जोड़ता है। जब सॉकेट() के साथ सॉकेट बनाया जाता है, तो इसे केवल प्रोटोकॉल परिवार दिया जाता है, लेकिन कोई पता नहीं दिया जाता है। सॉकेट अन्य आयोजकों से कनेक्शन स्वीकार कर सकता है इससे पहले यह सहयोग किया जाना चाहिए। फलन में तीन तर्क हैं:
बाइंड () सॉकेट को पते से जोड़ता है। जब सॉकेट() के साथ सॉकेट बनाया जाता है, तो इसे केवल प्रोटोकॉल परिवार दिया जाता है, लेकिन कोई पता नहीं दिया जाता है। सॉकेट अन्य आयोजकों से कनेक्शन स्वीकार कर सकता है इससे पहले यह सहयोग किया जाना चाहिए। फलन में तीन तर्क हैं:
*<var>sockfd</var>, सॉकेट का प्रतिनिधित्व करने वाला एक विवरणक
*<var>sockfd</var>, सॉकेट का प्रतिनिधित्व करने वाला विवरणक
*<var>my_addr</var>, sockaddr संरचना के लिए एक संकेतक जो बाइंड किए जाने वाले पते का प्रतिनिधित्व करता है।
*<var>my_addr</var>, sockaddr संरचना के लिए संकेतक जो बाइंड किए जाने वाले पते का प्रतिनिधित्व करता है।
*<var>addrlen</var>, sockaddr संरचना के आकार को निर्दिष्ट करने वाले socklen_t प्रकार का एक क्षेत्र।
*<var>addrlen</var>, sockaddr संरचना के आकार को निर्दिष्ट करने वाले socklen_t प्रकार का क्षेत्र।
बाइंड () सफलता पर 0 और -1 त्रुटि होने पर रिटर्न देता है।
बाइंड () सफलता पर 0 और -1 त्रुटि होने पर रिटर्न देता है।


=== लिसेन ===
=== लिसेन ===
सॉकेट को एक पते से जोड़ने के बाद, <var>listen()</var> इसे इनकमिंग कनेक्शन के लिए तैयार करता है। चूँकि, यह केवल स्ट्रीम-ओरिएंटेड (कनेक्शन-ओरिएंटेड) डेटा मोड के लिए आवश्यक है, यानी, सॉकेट प्रकार (<var>SOCK_STREAM</var>, <var>SOCK_SEQPACKET</var>) के लिए। <var>listen()</var> को दो तर्कों की आवश्यकता है:
सॉकेट को पते से जोड़ने के बाद, <var>listen()</var> इसे इनकमिंग कनेक्शन के लिए तैयार करता है। चूँकि, यह केवल स्ट्रीम-ओरिएंटेड (कनेक्शन-ओरिएंटेड) डेटा मोड के लिए आवश्यक है, यानी, सॉकेट प्रकार (<var>SOCK_STREAM</var>, <var>SOCK_SEQPACKET</var>) के लिए। <var>listen()</var> को दो तर्कों की आवश्यकता है:
* <var>sockfd</var>, एक मान्य सॉकेट डिस्क्रिप्टर।
* <var>sockfd</var>, मान्य सॉकेट डिस्क्रिप्टर।
* <var>बैकलॉग</var>, लंबित कनेक्शनों की संख्या का प्रतिनिधित्व करने वाला एक पूर्णांक जिसे किसी भी समय कतारबद्ध किया जा सकता है। ऑपरेटिंग प्रणाली सामान्यतः इस मान पर एक कैप लगाता है।
* <var>बैकलॉग</var>, लंबित कनेक्शनों की संख्या का प्रतिनिधित्व करने वाला पूर्णांक जिसे किसी भी समय कतारबद्ध किया जा सकता है। ऑपरेटिंग प्रणाली सामान्यतः इस मान पर कैप लगाता है।
एक बार एक कनेक्शन स्वीकार कर लेने के बाद, इसे हटा दिया जाता है। सफल होने पर, 0 लौटाया जाता है। यदि कोई त्रुटि होती है, तो -1 वापस आ जाता है।
एक बार कनेक्शन स्वीकार कर लेने के बाद, इसे हटा दिया जाता है। सफल होने पर, 0 लौटाया जाता है। यदि कोई त्रुटि होती है, तो -1 वापस आ जाता है।


=== स्वीकार करें ===
=== स्वीकार करें ===
जब कोई एप्लिकेशन अन्य आयोजकों से स्ट्रीम-ओरिएंटेड कनेक्शन के लिए सुन रहा होता है, तो उसे ऐसी घटनाओं के बारे में सूचित किया जाता है (cf. सेलेक्ट (यूनिक्स) | सेलेक्ट () फलन) और फलन स्वीकार () का उपयोग करके कनेक्शन को प्रारंभिककरण करना चाहिए। यह प्रत्येक कनेक्शन के लिए एक नया सॉकेट बनाता है और कनेक्शन को लिसेन की कतार से हटा देता है। फलन में निम्नलिखित तर्क हैं:
जब कोई एप्लिकेशन अन्य आयोजकों से स्ट्रीम-ओरिएंटेड कनेक्शन के लिए सुन रहा होता है, तो उसे ऐसी घटनाओं के बारे में सूचित किया जाता है (cf. सेलेक्ट (यूनिक्स) | सेलेक्ट () फलन) और फलन स्वीकार () का उपयोग करके कनेक्शन को प्रारंभिककरण करना चाहिए। यह प्रत्येक कनेक्शन के लिए नया सॉकेट बनाता है और कनेक्शन को लिसेन की कतार से हटा देता है। फलन में निम्नलिखित तर्क हैं:
* <var>sockfd</var>, लिसनिंग सॉकेट का डिस्क्रिप्टर जिसमें कनेक्शन कतारबद्ध है।
* <var>sockfd</var>, लिसनिंग सॉकेट का डिस्क्रिप्टर जिसमें कनेक्शन कतारबद्ध है।
* <var>cliaddr</var>, क्लाइंट के पते की जानकारी प्राप्त करने के लिए sockaddr संरचना का सूचक।
* <var>cliaddr</var>, क्लाइंट के पते की जानकारी प्राप्त करने के लिए sockaddr संरचना का सूचक।
* <var>addrlen</var>, एक socklen_t स्थान के लिए एक सूचक जो स्वीकार करने के लिए पास किए गए क्लाइंट पता संरचना के आकार को निर्दिष्ट करता है ()। जब स्वीकार () रिटर्न होता है, तो इस स्थान में संरचना का आकार (बाइट्स में) होता है।
* <var>addrlen</var>, socklen_t स्थान के लिए सूचक जो स्वीकार करने के लिए पास किए गए क्लाइंट पता संरचना के आकार को निर्दिष्ट करता है ()। जब स्वीकार () रिटर्न होता है, तो इस स्थान में संरचना का आकार (बाइट्स में) होता है।


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


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


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


कनेक्ट () त्रुटि कोड का प्रतिनिधित्व करने वाला एक पूर्णांक देता है: 0 सफलता का प्रतिनिधित्व करता है, जबकि -1 एक त्रुटि का प्रतिनिधित्व करता है। ऐतिहासिक रूप से, बीएसडी-व्युत्पन्न प्रणालियों में, सॉकेट डिस्क्रिप्टर की स्थिति अपरिभाषित होती है यदि कनेक्ट करने के लिए कॉल विफल हो जाती है (जैसा कि यह एकल यूनिक्स विशिष्टता में निर्दिष्ट है), इस प्रकार, पोर्टेबल एप्लिकेशन को सॉकेट डिस्क्रिप्टर को तुरंत बंद करना चाहिए और एक नया डिस्क्रिप्टर प्राप्त करना चाहिए सॉकेट (), स्थितियों में कनेक्ट करने के लिए कॉल () विफल रहता है।{{sfn|Stevens|Rago|2013|p=607}}
कनेक्ट () त्रुटि कोड का प्रतिनिधित्व करने वाला पूर्णांक देता है: 0 सफलता का प्रतिनिधित्व करता है, जबकि -1 त्रुटि का प्रतिनिधित्व करता है। ऐतिहासिक रूप से, बीएसडी-व्युत्पन्न प्रणालियों में, सॉकेट डिस्क्रिप्टर की स्थिति अपरिभाषित होती है यदि कनेक्ट करने के लिए कॉल विफल हो जाती है (जैसा कि यह एकल यूनिक्स विशिष्टता में निर्दिष्ट है), इस प्रकार, पोर्टेबल एप्लिकेशन को सॉकेट डिस्क्रिप्टर को तुरंत बंद करना चाहिए और नया डिस्क्रिप्टर प्राप्त करना चाहिए सॉकेट (), स्थितियों में कनेक्ट करने के लिए कॉल () विफल रहता है।{{sfn|Stevens|Rago|2013|p=607}}


=== gethostbyname और gethostbyaddr ===
=== gethostbyname और gethostbyaddr ===
कार्य gethostbyname() और gethostbyaddr() का उपयोग [[डोमेन की नामांकन प्रणाली]] या स्थानीय आयोजकों के अन्य रिज़ॉल्वर तंत्र (जैसे, /etc/hosts लुकअप) में आयोजकों नाम और पते को हल करने के लिए किया जाता है। वे <var>संरचना आयोजकोंेंट</var> प्रकार के ऑब्जेक्ट के लिए एक पॉइंटर लौटाते हैं, जो एक [[इंटरनेट प्रोटोकॉल]] आयोजकों का वर्णन करता है। कार्य निम्नलिखित तर्कों का उपयोग करते हैं:
कार्य gethostbyname() और gethostbyaddr() का उपयोग [[डोमेन की नामांकन प्रणाली]] या स्थानीय आयोजकों के अन्य रिज़ॉल्वर तंत्र (जैसे, /etc/hosts लुकअप) में आयोजकों नाम और पते को हल करने के लिए किया जाता है। वे <var>संरचना आयोजकोंेंट</var> प्रकार के ऑब्जेक्ट के लिए पॉइंटर लौटाते हैं, जो [[इंटरनेट प्रोटोकॉल]] आयोजकों का वर्णन करता है। कार्य निम्नलिखित तर्कों का उपयोग करते हैं:
* <var>name</var> आयोजकों का नाम निर्दिष्ट करता है।
* <var>name</var> आयोजकों का नाम निर्दिष्ट करता है।
* <var>addr</var> आयोजकों के पते वाले <var>struct in_addr</var> के लिए एक संकेतक निर्दिष्ट करता है।
* <var>addr</var> आयोजकों के पते वाले <var>struct in_addr</var> के लिए संकेतक निर्दिष्ट करता है।
* <var>len</var> <var>addr</var> की बाइट्स में लंबाई निर्दिष्ट करता है।
* <var>len</var> <var>addr</var> की बाइट्स में लंबाई निर्दिष्ट करता है।
* <var>type</var> आयोजकों पते का पता परिवार प्रकार (उदा., AF_INET) निर्दिष्ट करता है।
* <var>type</var> आयोजकों पते का पता परिवार प्रकार (उदा., AF_INET) निर्दिष्ट करता है।


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


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


कार्यों की यह जोड़ी 4.2बीएसडी (1983) में बीएसडी सॉकेट एपीआई के रूप में एक ही समय में दिखाई दी,<ref>{{man|3|gethostbyname|FreeBSD}}</ref> उसी वर्ष डीएनएस पहली बार बनाया गया था। प्रारंभी संस्करणों ने डीएनएस को क्वेरी नहीं किया और केवल /etc/hosts लुकअप किया। 4.3बीएसडी (1984) संस्करण ने डीएनएस को कच्चे विधियों से जोड़ा जाता है। [[नाम सेवा स्विच]] का उपयोग करने वाला वर्तमान कार्यान्वयन सोलारिस और बाद में Netबीएसडी 1.4 (1999) को प्राप्त करता है।<ref name="Conill">{{cite web |last1=Conill |first1=Ariadne |title=gethostbyname की त्रासदी|url=https://ariadne.space/2022/03/27/the-tragedy-of-gethostbyname/ |website=ariadne.space |date=March 27, 2022}}</ref> प्रारंभ में एनआईएस+ के लिए परिभाषित, एनएसएस डीएनएस को इन कार्यों द्वारा देखने के लिए कई विकल्पों में से केवल एक बनाता है और इसका उपयोग आज भी अक्षम किया जा सकता है।<ref>{{man|5|nsswitch.conf|FreeBSD}}</ref>
कार्यों की यह जोड़ी 4.2बीएसडी (1983) में बीएसडी सॉकेट एपीआई के रूप में एक ही समय में दिखाई दी,<ref>{{man|3|gethostbyname|FreeBSD}}</ref> उसी वर्ष डीएनएस पहली बार बनाया गया था। प्रारंभी संस्करणों ने डीएनएस को क्वेरी नहीं किया और केवल /etc/hosts लुकअप किया। 4.3बीएसडी (1984) संस्करण ने डीएनएस को कच्चे विधियों से जोड़ा जाता है। [[नाम सेवा स्विच]] का उपयोग करने वाला वर्तमान कार्यान्वयन सोलारिस और बाद में Netबीएसडी 1.4 (1999) को प्राप्त करता है।<ref name="Conill">{{cite web |last1=Conill |first1=Ariadne |title=gethostbyname की त्रासदी|url=https://ariadne.space/2022/03/27/the-tragedy-of-gethostbyname/ |website=ariadne.space |date=March 27, 2022}}</ref> प्रारंभ में एनआईएस+ के लिए परिभाषित, एनएसएस डीएनएस को इन कार्यों द्वारा देखने के लिए कई विकल्पों में से केवल एक बनाता है और इसका उपयोग आज भी अक्षम किया जा सकता है।<ref>{{man|5|nsswitch.conf|FreeBSD}}</ref>
Line 141: Line 141:


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


निम्नलिखित एक आधुनिक [[लिनक्स]] या [[बीएसडी]] कार्यान्वयन में परिभाषित प्रोटोकॉल परिवारों (मानक प्रतीकात्मक पहचानकर्ता से पहले) का एक नमूना सूचीबद्ध करता है:
निम्नलिखित आधुनिक [[लिनक्स]] या [[बीएसडी]] कार्यान्वयन में परिभाषित प्रोटोकॉल परिवारों (मानक प्रतीकात्मक पहचानकर्ता से पहले) का नमूना सूचीबद्ध करता है:
{| class="wikitable sortable"
{| class="wikitable sortable"
!पहचानकर्ता || कार्य या प्रयोग
!पहचानकर्ता || कार्य या प्रयोग
Line 167: Line 167:
|style="font-weight:bold"|PF_INET6 || [[IPv6|इंटरनेट प्रोटोकॉल संस्करण 6]]
|style="font-weight:bold"|PF_INET6 || [[IPv6|इंटरनेट प्रोटोकॉल संस्करण 6]]
|-
|-
|PF_IPX || '''Novell's''' [[Internetwork Packet Exchange|नोवेल का इंटरनेटवर्क पैकेट एक्सचेंज '''Packet Exchange''']]
|PF_IPX || [[Internetwork Packet Exchange|नोवेल का इंटरनेटवर्क पैकेट एक्सचेंज]]  
|-
|-
|PF_IRDA || आईआरडीए सॉकेट
|PF_IRDA || आईआरडीए सॉकेट
Line 185: Line 185:
|PF_PACKET || पैकेट कैप्चर सॉकेट
|PF_PACKET || पैकेट कैप्चर सॉकेट
|-
|-
|PF_PPPOX || [[PPPoX|पीपीपी एक्स सॉकेट पर '''over X''']] '''sockets'''
|PF_PPPOX || [[PPPoX|पीपीपी एक्स सॉकेट पर]]  
|-
|-
|PF_SNA || '''Linux''' [[Systems Network Architecture|लिनक्स सिस्टम नेटवर्क आर्किटेक्चर (एसएनए) प्रोजेक्ट '''Network Architecture''']] '''(SNA) Project'''
|PF_SNA || [[Systems Network Architecture|लिनक्स सिस्टम नेटवर्क आर्किटेक्चर (एसएनए) प्रोजेक्ट]]
|-
|-
|PF_WANPIPE || सांगोमा वानपाइप एपीआई सॉकेट
|PF_WANPIPE || सांगोमा वानपाइप एपीआई सॉकेट
|}
|}
संचार के लिए एक सॉकेट के साथ बनाया गया है {{code|socket()}} फलन, वांछित प्रोटोकॉल परिवार निर्दिष्ट करके ({{mono|PF_}}-पहचानकर्ता) एक तर्क के रूप में।
संचार के लिए सॉकेट के साथ बनाया गया है {{code|socket()}} फलन, वांछित प्रोटोकॉल परिवार निर्दिष्ट करके ({{mono|PF_}}-पहचानकर्ता) तर्क के रूप में।


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


चूँकि, प्रोटोकॉल और पता प्रकार को अलग करने की इस अवधारणा को कार्यान्वयन समर्थन नहीं मिला है और {{mono|AF}}-स्थिरांक को संबंधित प्रोटोकॉल पहचानकर्ता द्वारा परिभाषित किया गया था, जिसके बीच अंतर छोड़ दिया गया था {{mono|AF}} और {{mono|PF}} कोई व्यावहारिक परिणाम के तकनीकी तर्क के रूप में स्थिरांक। दरअसल, दोनों रूपों के उचित उपयोग में काफी भ्रम उपस्थित है।<ref>''UNIX Network Programming'' Volume 1, Third  Edition: The Sockets Networking API,  W. Richard Stevens, Bill Fenner, Andrew M. Rudoff, Addison Wesley, 2003.</ref>
चूँकि, प्रोटोकॉल और पता प्रकार को अलग करने की इस अवधारणा को कार्यान्वयन समर्थन नहीं मिला है और {{mono|AF}}-स्थिरांक को संबंधित प्रोटोकॉल पहचानकर्ता द्वारा परिभाषित किया गया था, जिसके बीच अंतर छोड़ दिया गया था {{mono|AF}} और {{mono|PF}} कोई व्यावहारिक परिणाम के तकनीकी तर्क के रूप में स्थिरांक। दरअसल, दोनों रूपों के उचित उपयोग में काफी भ्रम उपस्थित है।<ref>''UNIX Network Programming'' Volume 1, Third  Edition: The Sockets Networking API,  W. Richard Stevens, Bill Fenner, Andrew M. Rudoff, Addison Wesley, 2003.</ref>
Line 202: Line 202:


=== कच्चे सॉकेट ===
=== कच्चे सॉकेट ===
कच्चे सॉकेट एक सरल इंटरफ़ेस प्रदान करते हैं जो आयोजकों के टीसीपी/आईपी स्टैक द्वारा प्रसंस्करण को बायपास करता है। वे उपयोगकर्ता स्थान में नेटवर्किंग प्रोटोकॉल के कार्यान्वयन की अनुमति देते हैं और प्रोटोकॉल स्टैक के डिबगिंग में सहायता करते हैं।<ref>{{cite web | url=https://msdn.microsoft.com/en-us/library/windows/desktop/ms740548(v=vs.85).aspx | title=TCP/IP raw sockets - Win32 apps }}</ref> कच्चे सॉकेट का उपयोग कुछ सेवाओं द्वारा किया जाता है, जैसे कि [[इंटरनेट नियंत्रण संदेश प्रोटोकॉल]], जो टीसीपी/आईपी मॉडल के [[ इंटरनेट परत ]] पर काम करता है।
कच्चे सॉकेट सरल इंटरफ़ेस प्रदान करते हैं जो आयोजकों के टीसीपी/आईपी स्टैक द्वारा प्रसंस्करण को बायपास करता है। वे उपयोगकर्ता स्थान में नेटवर्किंग प्रोटोकॉल के कार्यान्वयन की अनुमति देते हैं और प्रोटोकॉल स्टैक के डिबगिंग में सहायता करते हैं।<ref>{{cite web | url=https://msdn.microsoft.com/en-us/library/windows/desktop/ms740548(v=vs.85).aspx | title=TCP/IP raw sockets - Win32 apps }}</ref> कच्चे सॉकेट का उपयोग कुछ सेवाओं द्वारा किया जाता है, जैसे कि [[इंटरनेट नियंत्रण संदेश प्रोटोकॉल]], जो टीसीपी/आईपी मॉडल के [[ इंटरनेट परत ]] पर काम करता है।


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


एक अवरुद्ध सॉकेट तब तक नियंत्रण वापस नहीं करता जब तक कि उसने ऑपरेशन के लिए निर्दिष्ट कुछ या सभी डेटा नहीं भेजे (या प्राप्त किए)। अवरुद्ध सॉकेट के लिए सभी डेटा नहीं भेजना सामान्य है। कितने बाइट भेजे या प्राप्त किए गए हैं यह निर्धारित करने के लिए एप्लिकेशन को वापसी मूल्य की जांच करनी चाहिए और इसे पहले से संसाधित नहीं किए गए किसी भी डेटा को फिर से भेजना चाहिए।<ref>{{cite web|url=http://beej.us/guide/bgnet/ |title=बीज की नेटवर्क प्रोग्रामिंग के लिए गाइड|publisher=Beej.us |date=2007-05-05 |access-date=2012-07-26}}</ref> अवरुद्ध सॉकेट्स का उपयोग करते समय, स्वीकार करने के लिए विशेष ध्यान दिया जाना चाहिए () क्योंकि यह पठनीयता का संकेत देने के बाद भी ब्लॉक हो सकता है यदि क्लाइंट कनेक्शन चरण के समय डिस्कनेक्ट हो जाता है।
अवरुद्ध सॉकेट तब तक नियंत्रण वापस नहीं करता जब तक कि उसने ऑपरेशन के लिए निर्दिष्ट कुछ या सभी डेटा नहीं भेजे (या प्राप्त किए)। अवरुद्ध सॉकेट के लिए सभी डेटा नहीं भेजना सामान्य है। कितने बाइट भेजे या प्राप्त किए गए हैं यह निर्धारित करने के लिए एप्लिकेशन को वापसी मूल्य की जांच करनी चाहिए और इसे पहले से संसाधित नहीं किए गए किसी भी डेटा को फिर से भेजना चाहिए।<ref>{{cite web|url=http://beej.us/guide/bgnet/ |title=बीज की नेटवर्क प्रोग्रामिंग के लिए गाइड|publisher=Beej.us |date=2007-05-05 |access-date=2012-07-26}}</ref> अवरुद्ध सॉकेट्स का उपयोग करते समय, स्वीकार करने के लिए विशेष ध्यान दिया जाना चाहिए () क्योंकि यह पठनीयता का संकेत देने के बाद भी ब्लॉक हो सकता है यदि क्लाइंट कनेक्शन चरण के समय डिस्कनेक्ट हो जाता है।


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


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


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


जब कोई एप्लिकेशन सॉकेट को बंद करता है, तो केवल सॉकेट का इंटरफ़ेस नष्ट हो जाता है। सॉकेट को आंतरिक रूप से नष्ट करना कर्नेल की जिम्मेदारी है। कभी-कभी, एक सॉकेट a में प्रवेश कर सकता है {{mono|TIME_WAIT}} स्टेट, सर्वर साइड पर, 4 मिनट तक।<ref>{{cite web|url=http://www.softlab.ntua.gr/facilities/documentation/unix/unix-socket-faq/unix-socket-faq-4.html#ss4.2 |title=समापन सॉकेट|publisher=Softlab.ntua.gr |access-date=2012-07-26}}</ref>
जब कोई एप्लिकेशन सॉकेट को बंद करता है, तो केवल सॉकेट का इंटरफ़ेस नष्ट हो जाता है। सॉकेट को आंतरिक रूप से नष्ट करना कर्नेल की जिम्मेदारी है। कभी-कभी, सॉकेट a में प्रवेश कर सकता है {{mono|TIME_WAIT}} स्टेट, सर्वर साइड पर, 4 मिनट तक।<ref>{{cite web|url=http://www.softlab.ntua.gr/facilities/documentation/unix/unix-socket-faq/unix-socket-faq-4.html#ss4.2 |title=समापन सॉकेट|publisher=Softlab.ntua.gr |access-date=2012-07-26}}</ref>
 
[[SVR4]] प्रणाली पर इसका उपयोग {{code|close()}} डेटा छोड़ सकता है। का उपयोग {{code|shutdown()}} या SO_LINGER सभी डेटा के वितरण की गारंटी के लिए इन प्रणालीों पर आवश्यक हो सकता है।<ref>{{cite web|url=http://www.softlab.ntua.gr/facilities/documentation/unix/unix-socket-faq/unix-socket-faq-2.html#time_wait |title=ntua.gr - Programming UNIX Sockets in C - Frequently Asked Questions: Questions regarding both Clients and Servers (TCP/SOCK_STREAM) |publisher=Softlab.ntua.gr |access-date=2012-07-26}}</ref>
[[SVR4]] प्रणाली पर इसका उपयोग {{code|close()}} डेटा छोड़ सकता है। का उपयोग {{code|shutdown()}} या SO_LINGER सभी डेटा के वितरण की गारंटी के लिए इन प्रणालीों पर आवश्यक हो सकता है।<ref>{{cite web|url=http://www.softlab.ntua.gr/facilities/documentation/unix/unix-socket-faq/unix-socket-faq-2.html#time_wait |title=ntua.gr - Programming UNIX Sockets in C - Frequently Asked Questions: Questions regarding both Clients and Servers (TCP/SOCK_STREAM) |publisher=Softlab.ntua.gr |access-date=2012-07-26}}</ref>






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


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


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


<syntaxhighlight lang="c">
<syntaxhighlight lang="c">
Line 301: Line 303:


=== क्लाइंट ===
=== क्लाइंट ===
एक टीसीपी क्लाइंट एप्लिकेशन प्रोग्रामिंग में निम्नलिखित कदम सम्मिलित हैं:
टीसीपी क्लाइंट एप्लिकेशन प्रोग्रामिंग में निम्नलिखित कदम सम्मिलित हैं:
* एक टीसीपी सॉकेट बनाना।
* टीसीपी सॉकेट बनाना।
* सर्वर से कनेक्ट करना (कनेक्ट ()), एक पास करके {{code|sockaddr_in}} के साथ संरचना {{code|sin_family}} करने के लिए सेट {{mono|AF_INET}}, {{code|sin_port}} पोर्ट पर सेट करें समापन बिंदु सुन रहा है (नेटवर्क बाइट ऑर्डर में), और {{code|sin_addr}} लिसेन वाले सर्वर के आईपी पते पर सेट करें (नेटवर्क बाइट ऑर्डर में भी)।
* सर्वर से कनेक्ट करना (कनेक्ट ()), एक पास करके {{code|sockaddr_in}} के साथ संरचना {{code|sin_family}} करने के लिए सेट {{mono|AF_INET}}, {{code|sin_port}} पोर्ट पर सेट करें समापन बिंदु सुन रहा है (नेटवर्क बाइट ऑर्डर में), और {{code|sin_addr}} लिसेन वाले सर्वर के आईपी पते पर सेट करें (नेटवर्क बाइट ऑर्डर में भी)।
* एपीआई फलन सेंड () और आरईवी () के साथ-साथ सामान्य-उद्देश्य फलन राइट () और रीड () के साथ रिमोट आयोजकों के साथ संचार करना होता है।
* एपीआई फलन सेंड () और आरईवी () के साथ-साथ सामान्य-उद्देश्य फलन राइट () और रीड () के साथ रिमोट आयोजकों के साथ संचार करना होता है।
Line 351: Line 353:




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


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


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


'''एक एप्लिकेशन निम्नानुसार पोर्ट नंबर 7654 पर एक यूडीपी सर्वर स्थापित कर सकता है। प्रोग्राम में एक अनंत लूप होता है जो फलन recvfrom () के साथ यूडीपी डेटाग्राम प्राप्त करता है।'''<syntaxhighlight>
<syntaxhighlight>
#include <stdio.h>
#include <stdio.h>
#include <errno.h>
#include <errno.h>
Line 401: Line 403:
   }
   }
}
}
</syntaxhighlight><वाक्यविन्यास लैंग = सी हाइलाइट = 32,25,24>
</syntaxhighlight>
#सम्मिलित <stdio.h>
#सम्मिलित <errno.h>
#सम्मिलित <string.h>
#सम्मिलित <sys/socket.h>
#सम्मिलित <sys/types.h>
#सम्मिलित <netinet/in.h>
#सम्मिलित <unistd.h> /* सॉकेट के लिए बंद () के लिए */
#सम्मिलित <stdlib.h>
 
पूर्णांक मुख्य (शून्य)
{
  इंट सॉक;
  संरचना sockaddr_in sa;
  चार बफ़र [1024];
  ssize_t पुन: आकार;
  socklen_t fromlen;
 
  मेमसेट (और सा, 0, आकार का सा);
  sa.sin_family = AF_INET;
  sa.sin_addr.s_addr = htonl (INADDR_ANY);
  sa.sin_port = htons (7654);
  फ्रॉमलेन = साइज़ोफ़ सा;
 
  सॉक = सॉकेट (PF_INET, SOCK_DGRAM, IPPROTO_UDP);
  अगर (बाइंड (सॉक, (संरचना सॉकडैड्र *) और सा, साइजोफ सा) == -1) {
    पेरर (त्रुटि बाइंड विफल);
    करीब (जुर्राब);
    बाहर निकलें (EXIT_FAILURE);
  }
 
  के लिए (;;) {
    recsize = recvfrom(sock, (void*)buffer, sizeof बफर, 0, (struct sockaddr*)&sa, &fromlen);
    अगर (पुनरावृत्ति <0) {
      fprintf(stderr, %s\n , strerror(errno));
      बाहर निकलें (EXIT_FAILURE);
    }
    प्रिंटफ (पुनः आकार:% d \ n, (int) पुन: आकार);
    नींद (1);
    प्रिंटफ (डेटाग्राम:%। * एस \ n, (इंट) रिकसाइज, बफर);
  }
}
</वाक्यविन्यास हाइलाइट>
 
=== क्लाइंट ===
=== क्लाइंट ===
यूडीपी पैकेट भेजने के लिए निम्न क्लाइंट प्रोग्राम है जिसमें स्ट्रिंग हैलो वर्ल्ड! पोर्ट नंबर 7654 पर 127.0.0.1 को संबोधित करने के लिए।<syntaxhighlight>
यूडीपी पैकेट भेजने के लिए निम्न क्लाइंट प्रोग्राम है जिसमें स्ट्रिंग हैलो वर्ल्ड! पोर्ट नंबर 7654 पर 127.0.0.1 को संबोधित करने के लिए।<syntaxhighlight>
Line 495: Line 454:
   return 0;
   return 0;
}
}
</syntaxhighlight><वाक्यविन्यास प्रकाश लैंग = सी हाइलाइट = 40>
</syntaxhighlight>
#सम्मिलित <stdlib.h>
#सम्मिलित <stdio.h>
#सम्मिलित <errno.h>
#सम्मिलित <string.h>
#सम्मिलित <sys/socket.h>
#सम्मिलित <sys/types.h>
#सम्मिलित <netinet/in.h>
#सम्मिलित <unistd.h>
#सम्मिलित <arpa/inet.h>


पूर्णांक मुख्य (शून्य)
{
  इंट सॉक;
  संरचना sockaddr_in sa;
  इंट बाइट्स_सेंट;
  चार बफर [200];
  strcpy (बफर, हैलो वर्ल्ड!);
  / * UDP का उपयोग करके इंटरनेट, डेटाग्राम, सॉकेट बनाएं */
  सॉक = सॉकेट (PF_INET, SOCK_DGRAM, IPPROTO_UDP);
  अगर (सॉक == -1) {
      / * यदि सॉकेट आरंभ करने में विफल रहता है, तो बाहर निकलें * /
      प्रिंटफ (सॉकेट बनाने में त्रुटि);
      बाहर निकलें (EXIT_FAILURE);
  }
  / * सॉकेट पता शून्य करें * /
  मेमसेट (और सा, 0, आकार का सा);
 
  /* पता IPv4 है */
  sa.sin_family = AF_INET;
  /* IPv4 पता एक uint32_t है, ऑक्टेट के एक स्ट्रिंग प्रतिनिधित्व को उचित मान में बदलें */
  sa.sin_addr.s_addr = inet_addr (127.0.0.1);
 
  /* सॉकेट अहस्ताक्षरित शॉर्ट्स हैं, htons(x) सुनिश्चित करता है कि x नेटवर्क बाइट क्रम में है, पोर्ट को 7654 पर सेट करें */
  sa.sin_port = htons (7654);
  बाइट्स_सेंट = सेंडटो (सॉक, बफर, स्ट्रेल (बफर), 0, (संरचना सॉकडैडर *) और एस, साइजोफ सा);
  अगर (बाइट्स_सेंट <0) {
    प्रिंटफ (पैकेट भेजने में त्रुटि:% s \ n, स्ट्रेरर (त्रुटि));
    बाहर निकलें (EXIT_FAILURE);
  }
  करीब (जुर्राब); / * सॉकेट बंद करें * /
  वापसी 0;
}
</वाक्यविन्यास हाइलाइट>


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


==संदर्भ==
==संदर्भ==
Line 569: Line 480:
* [https://www.linuxjournal.com/article/2333 Linux network programming] - ''[[Linux Journal]]'', 1998
* [https://www.linuxjournal.com/article/2333 Linux network programming] - ''[[Linux Journal]]'', 1998


<!-- Please respect alphabetical order -->
{{DEFAULTSORT:Berkeley Sockets}}[[Category: नेटवर्क सॉकेट]] [[Category: एप्लिकेशन प्रोग्रामिंग इंटरफेस]] [[Category: उदाहरण सी कोड वाले लेख]] [[Category: बर्कले सॉफ्टवेयर वितरण]]  
{{DEFAULTSORT:Berkeley Sockets}}[[Category: नेटवर्क सॉकेट]] [[Category: एप्लिकेशन प्रोग्रामिंग इंटरफेस]] [[Category: उदाहरण सी कोड वाले लेख]] [[Category: बर्कले सॉफ्टवेयर वितरण]]  



Revision as of 19:13, 3 May 2023

बर्कले सॉकेट्स इंटरनेट सॉकेट और यूनिक्स डोमेन सॉकेट के लिए अप्लिकेशन प्रोग्रामिंग अंतरफलक (एपीआई) है, जिसका प्रयोग अंतःप्रक्रम संचार (आईपीसी) के लिए किया जाता है। यह सामान्यतः लिंक करने योग्य मॉड्यूल के पुस्तकालय (कंप्यूटिंग) के रूप में कार्यान्वित किया जाता है। इसका प्रारंभ बर्कले सॉफ्टवेयर वितरण 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 Core socket functions and data structures.
netinet/in.h AF_INET and AF_INET6 address families and their corresponding protocol families, PF_INET and PF_INET6. These include standard IP addresses and TCP and UDP port numbers.
sys/un.h PF_UNIX and PF_LOCAL address family. Used for local communication between programs running on the same computer.
arpa/inet.h Functions for manipulating numeric IP addresses.
netdb.h Functions for translating protocol names and host names into numeric addresses. Searches local data as well as name services.


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

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

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

  • सॉकेट () निश्चित प्रकार का नया सॉकेट बनाता है, जिसे पूर्णांक संख्या द्वारा पहचाना जाता है, और इसके लिए प्रणाली संसाधन आवंटित करता है।
  • बाइंड () सामान्यतः सर्वर साइड पर उपयोग किया जाता है, और सॉकेट को सॉकेट एड्रेस संरचना, यानी निर्दिष्ट स्थानीय आईपी एड्रेस और पोर्ट नंबर के साथ जोड़ता है।
  • सुनो () सर्वर साइड पर उपयोग किया जाता है, और बाध्य टीसीपी सॉकेट को लिसेन की स्थिति में प्रवेश करने का कारण बनता है।
  • कनेक्ट() क्लाइंट साइड पर प्रयोग किया जाता है, और सॉकेट को मुफ्त स्थानीय पोर्ट नंबर असाइन करता है। टीसीपी सॉकेट के स्थितियों में, यह नया टीसीपी कनेक्शन स्थापित करने का प्रयास करता है।
  • स्वीकार करें () का उपयोग सर्वर साइड पर किया जाता है। यह रिमोट क्लाइंट से नया टीसीपी कनेक्शन बनाने के लिए आने वाले प्रयास को स्वीकार करता है, और इस कनेक्शन के सॉकेट एड्रेस जोड़ी से जुड़ा नया सॉकेट बनाता है।
  • सेंड (), आरईवी (), सेंडटो (), और रिकवफ्रॉम () का उपयोग डेटा भेजने और प्राप्त करने के लिए किया जाता है। मानक फलन राइट () और रीड () का भी उपयोग किया जा सकता है।
  • बंद () प्रणाली को सॉकेट के लिए आवंटित संसाधनों को प्रयुक्त करने का कारण बनता है। टीसीपी के स्थितियों में, कनेक्शन समाप्त कर दिया गया है।
  • 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.


बाहरी संबंध