बर्कले सॉकेट
बर्कले सॉकेट्स इंटरनेट सॉकेट्स और यूनिक्स डोमेन सॉकेट्स के लिए एक अप्लिकेशन प्रोग्रामिंग अंतरफलक (एपीआई) है, जिसका इस्तेमाल अंतःप्रक्रम संचार (आईपीसी) के लिए किया जाता है। यह आमतौर पर लिंक करने योग्य मॉड्यूल के पुस्तकालय (कंप्यूटिंग) के रूप में कार्यान्वित किया जाता है। इसकी शुरुआत बर्कले सॉफ्टवेयर वितरण#4BSD|4.2BSD यूनिक्स ऑपरेटिंग सिस्टम के इतिहास से हुई, जिसे 1983 में जारी किया गया था।
नेटवर्क संचार पथ के स्थानीय समापन बिंदु के लिए एक नेटवर्क सॉकेट एक सार प्रतिनिधित्व (हैंडल (कंप्यूटिंग)) है। बर्कले सॉकेट्स एपीआई इसे यूनिक्स दर्शन में एक फाइल डिस्क्रिप्टर (फ़ाइल संभाल ) के रूप में प्रस्तुत करता है जो डेटा के मानक स्ट्रीम में इनपुट और आउटपुट के लिए एक सामान्य इंटरफ़ेस प्रदान करता है।
बर्कले सॉकेट एक वास्तविक मानक से थोड़ा संशोधन के साथ विकसित हुए हैं।वास्तविक मानक POSIX विनिर्देश के एक घटक में। POSIX सॉकेट्स शब्द अनिवार्य रूप से 'बर्कले सॉकेट्स' का पर्याय है, लेकिन उन्हें BSD सॉकेट्स के रूप में भी जाना जाता है, जो बर्कले सॉफ्टवेयर डिस्ट्रीब्यूशन में पहले कार्यान्वयन को स्वीकार करते हैं।
इतिहास और कार्यान्वयन
बर्कले सॉकेट्स की उत्पत्ति 4.2BSD यूनिक्स ऑपरेटिंग सिस्टम के साथ हुई, जिसे 1983 में एक प्रोग्रामिंग इंटरफेस के रूप में जारी किया गया था। हालांकि, 1989 तक, कैलिफोर्निया विश्वविद्यालय, बर्कले ऑपरेटिंग सिस्टम और नेटवर्किंग लाइब्रेरी के संस्करणों को AT&T Corporation के स्वामित्व वाली यूनिक्स की लाइसेंसिंग बाधाओं से मुक्त नहीं कर सका।
सभी आधुनिक ऑपरेटिंग सिस्टम बर्कले सॉकेट इंटरफ़ेस के एक संस्करण को लागू करते हैं। यह इंटरनेट में चल रहे अनुप्रयोगों के लिए मानक इंटरफ़ेस बन गया। यहां तक कि असंबद्ध डेवलपर्स द्वारा बनाए गए MS Windows के लिए Winsock कार्यान्वयन भी मानक का बारीकी से पालन करता है।
बीएसडी सॉकेट एपीआई सी (प्रोग्रामिंग भाषा) में लिखा गया है। अधिकांश अन्य प्रोग्रामिंग लैंग्वेज समान इंटरफेस प्रदान करती हैं, जिन्हें आमतौर पर C API पर आधारित रैपर लाइब्रेरी के रूप में लिखा जाता है।[1]
बीएसडी और पॉज़िक्स सॉकेट
जैसा कि बर्कले सॉकेट एपीआई विकसित हुआ और अंततः POSIX सॉकेट एपीआई निकला,[2] कुछ कार्यों को बहिष्कृत या हटा दिया गया और अन्य द्वारा प्रतिस्थापित किया गया। POSIX API को भी पुनर्वित्त (कंप्यूटिंग) के लिए डिज़ाइन किया गया है और IPv6 का समर्थन करता है।
Action | BSD | POSIX |
---|---|---|
Conversion from text address to packed address | inet_aton | inet_pton |
Conversion from packed address to text address | inet_ntoa | inet_ntop |
Forward lookup for host name/service | gethostbyname, gethostbyaddr, getservbyname, getservbyport | getaddrinfo |
Reverse lookup for host name/service | gethostbyaddr, getservbyport | getnameinfo |
विकल्प
स्ट्रीम (नेटवर्किंग एपीआई) आधारित ट्रांसपोर्ट लेयर इंटरफ़ेस (टीएलआई) एपीआई सॉकेट एपीआई के लिए एक विकल्प प्रदान करता है। टीएलआई एपीआई प्रदान करने वाली कई प्रणालियां बर्कले सॉकेट एपीआई भी प्रदान करती हैं।
गैर-यूनिक्स सिस्टम अक्सर बर्कले सॉकेट एपीआई को अनुवाद परत के साथ मूल नेटवर्किंग एपीआई में उजागर करते हैं। बेल लैब्स से प्लान 9[3] और जीनोड[4] फाइल-डिस्क्रिप्टर के बजाय नियंत्रण फाइलों के साथ फाइल-सिस्टम एपीआई का उपयोग करें।
हैडर फ़ाइलें
बर्कले सॉकेट इंटरफ़ेस को कई शीर्षलेख फ़ाइलों में परिभाषित किया गया है। कार्यान्वयन के बीच इन फ़ाइलों के नाम और सामग्री थोड़ी भिन्न होती है। सामान्य तौर पर, इनमें शामिल हैं:
File | Description |
---|---|
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() का उपयोग होस्ट नाम और पते को हल करने के लिए किया जाता है। आईपीवी4, आईपीवी6.
- चयन () का उपयोग निलंबित करने के लिए किया जाता है, सॉकेट्स की एक या अधिक प्रदान की गई सूची को पढ़ने के लिए तैयार होने, लिखने के लिए तैयार होने या त्रुटियों के लिए प्रतीक्षा करने के लिए।
- पोल () का उपयोग सॉकेट के सेट में सॉकेट की स्थिति की जांच के लिए किया जाता है। यह देखने के लिए सेट का परीक्षण किया जा सकता है कि क्या कोई सॉकेट लिखा जा सकता है, पढ़ा जा सकता है या कोई त्रुटि हुई है या नहीं।
- 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.2BSD (1983) में BSD सॉकेट एपीआई के रूप में एक ही समय में दिखाई दी,[7] उसी वर्ष DNS पहली बार बनाया गया था। शुरुआती संस्करणों ने DNS को क्वेरी नहीं किया और केवल /etc/hosts लुकअप किया। 4.3BSD (1984) संस्करण ने DNS को कच्चे तरीके से जोड़ा। नाम सेवा स्विच का उपयोग करने वाला वर्तमान कार्यान्वयन Solaris और बाद में NetBSD 1.4 (1999) को प्राप्त करता है।[8] प्रारंभ में एनआईएस+ के लिए परिभाषित, एनएसएस डीएनएस को इन कार्यों द्वारा देखने के लिए कई विकल्पों में से केवल एक बनाता है और इसका उपयोग आज भी अक्षम किया जा सकता है।[9]
प्रोटोकॉल और पता परिवारों
बर्कले सॉकेट एपीआई नेटवर्किंग और इंटरप्रोसेस संचार के लिए एक सामान्य इंटरफ़ेस है, और विभिन्न नेटवर्क प्रोटोकॉल और एड्रेस आर्किटेक्चर के उपयोग का समर्थन करता है।
निम्नलिखित एक आधुनिक लिनक्स या बीएसडी कार्यान्वयन में परिभाषित प्रोटोकॉल परिवारों (मानक प्रतीकात्मक पहचानकर्ता से पहले) का एक नमूना सूचीबद्ध करता है:
Identifier | Function or use |
---|---|
PF_APPLETALK | AppleTalk |
PF_ATMPVC | Asynchronous Transfer Mode Permanent Virtual Circuits |
PF_ATMSVC | Asynchronous Transfer Mode Switched Virtual Circuits |
PF_AX25 | Amateur Radio AX.25 |
PF_BLUETOOTH | Bluetooth sockets |
PF_BRIDGE | Multiprotocol bridge |
PF_DECnet | Reserved for DECnet project |
PF_ECONET | Acorn Econet |
PF_INET | Internet Protocol version 4 |
PF_INET6 | Internet Protocol version 6 |
PF_IPX | Novell's Internetwork Packet Exchange |
PF_IRDA | IrDA sockets |
PF_KEY | PF_KEY key management API |
PF_LOCAL, PF_UNIX, PF_FILE | Local to host (pipes and file-domain) |
PF_NETROM | Amateur radio NET/ROM (related to AX.25)[10] |
PF_NETBEUI | Reserved for 802.2LLC project |
PF_SECURITY | Security callback pseudo AF |
PF_NETLINK, PF_ROUTE | routing API |
PF_PACKET | Packet capture sockets |
PF_PPPOX | PPP over X sockets |
PF_SNA | Linux Systems Network Architecture (SNA) Project |
PF_WANPIPE | Sangoma Wanpipe API sockets |
संचार के लिए एक सॉकेट के साथ बनाया गया है socket()
समारोह, वांछित प्रोटोकॉल परिवार निर्दिष्ट करके (PF_-पहचानकर्ता) एक तर्क के रूप में।
सॉकेट इंटरफ़ेस की मूल डिजाइन अवधारणा प्रोटोकॉल प्रकार (परिवारों) और प्रत्येक उपयोग किए जा सकने वाले विशिष्ट पता प्रकारों के बीच प्रतिष्ठित है। यह कल्पना की गई थी कि एक प्रोटोकॉल परिवार के कई पता प्रकार हो सकते हैं। पता प्रकार उपसर्ग का उपयोग करके अतिरिक्त प्रतीकात्मक स्थिरांक द्वारा परिभाषित किए गए थे AF के बजाय PF. वह AF-पहचानकर्ता उन सभी डेटा संरचनाओं के लिए अभिप्रेत हैं जो विशेष रूप से पता प्रकार से संबंधित हैं न कि प्रोटोकॉल परिवार से। हालांकि, प्रोटोकॉल और पता प्रकार को अलग करने की इस अवधारणा को कार्यान्वयन समर्थन नहीं मिला है और AF-स्थिरांक को संबंधित प्रोटोकॉल पहचानकर्ता द्वारा परिभाषित किया गया था, जिसके बीच अंतर छोड़ दिया गया था AF और PF कोई व्यावहारिक परिणाम के तकनीकी तर्क के रूप में स्थिरांक। दरअसल, दोनों रूपों के उचित उपयोग में काफी भ्रम मौजूद है।[11] POSIX.1—2008 विनिर्देश कोई निर्दिष्ट नहीं करता है PF-स्थिरांक, लेकिन केवल AF-स्थिरांक[12]
कच्चे सॉकेट
कच्चे सॉकेट एक सरल इंटरफ़ेस प्रदान करते हैं जो होस्ट के टीसीपी/आईपी स्टैक द्वारा प्रसंस्करण को बायपास करता है। वे उपयोगकर्ता स्थान में नेटवर्किंग प्रोटोकॉल के कार्यान्वयन की अनुमति देते हैं और प्रोटोकॉल स्टैक के डिबगिंग में सहायता करते हैं।[13] कच्चे सॉकेट का उपयोग कुछ सेवाओं द्वारा किया जाता है, जैसे कि इंटरनेट नियंत्रण संदेश प्रोटोकॉल, जो टीसीपी/आईपी मॉडल के इंटरनेट परत पर काम करता है।
ब्लॉकिंग और नॉन-ब्लॉकिंग मोड
बर्कले सॉकेट दो मोड में से एक में काम कर सकता है: अवरोधन (कंप्यूटिंग) या नॉन-ब्लॉकिंग।
एक अवरुद्ध सॉकेट तब तक नियंत्रण वापस नहीं करता जब तक कि उसने ऑपरेशन के लिए निर्दिष्ट कुछ या सभी डेटा नहीं भेजे (या प्राप्त किए)। अवरुद्ध सॉकेट के लिए सभी डेटा नहीं भेजना सामान्य है। कितने बाइट भेजे या प्राप्त किए गए हैं यह निर्धारित करने के लिए एप्लिकेशन को वापसी मूल्य की जांच करनी चाहिए और इसे पहले से संसाधित नहीं किए गए किसी भी डेटा को फिर से भेजना चाहिए।[14] ब्लॉकिंग सॉकेट्स का उपयोग करते समय, स्वीकार करने के लिए विशेष ध्यान दिया जाना चाहिए () क्योंकि यह पठनीयता का संकेत देने के बाद भी ब्लॉक हो सकता है यदि क्लाइंट कनेक्शन चरण के दौरान डिस्कनेक्ट हो जाता है।
एक गैर-अवरुद्ध सॉकेट प्राप्त बफर में जो कुछ भी है उसे लौटाता है और तुरंत जारी रहता है। यदि सही ढंग से नहीं लिखा गया है, तो गैर-अवरोधक सॉकेट का उपयोग करने वाले प्रोग्राम विशेष रूप से नेटवर्क लिंक गति में भिन्नता के कारण दौड़ की स्थिति के लिए अतिसंवेदनशील होते हैं।[citation needed]
एक सॉकेट आमतौर पर 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;
}
== यूडीपी == का उपयोग कर क्लाइंट-सर्वर उदाहरण
उपयोगकर्ता डेटाग्राम प्रोटोकॉल (यूडीपी) एक संयोजन रहित प्रोटोकॉल है जिसमें डिलीवरी की कोई गारंटी नहीं है। UDP पैकेट क्रम से बाहर आ सकते हैं, कई बार आ सकते हैं, या बिल्कुल भी नहीं आ सकते हैं। इस न्यूनतम डिजाइन के कारण, यूडीपी में टीसीपी की तुलना में काफी कम ओवरहेड है। कनेक्शन रहित होने का अर्थ है कि दो मेजबानों के बीच धारा या स्थायी संबंध की कोई अवधारणा नहीं है। ऐसे डेटा को डेटाग्राम (डेटाग्राम सॉकेट) कहा जाता है।
UDP एड्रेस स्पेस, UDP पोर्ट नंबरों का स्पेस (ISO शब्दावली में, TSAPs), TCP पोर्ट्स से पूरी तरह से अलग है।
सर्वर
एक एप्लिकेशन निम्नानुसार पोर्ट नंबर 7654 पर एक यूडीपी सर्वर स्थापित कर सकता है। प्रोग्राम में एक अनंत लूप होता है जो फ़ंक्शन recvfrom () के साथ UDP डेटाग्राम प्राप्त करता है।
<वाक्यविन्यास लैंग = सी हाइलाइट = 32,25,24>
- शामिल <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, (इंट) रिकसाइज, बफर); }
} </वाक्यविन्यास हाइलाइट>
क्लाइंट
UDP पैकेट भेजने के लिए निम्न क्लाइंट प्रोग्राम है जिसमें स्ट्रिंग हैलो वर्ल्ड! पोर्ट नंबर 7654 पर 127.0.0.1 को संबोधित करने के लिए।
<वाक्यविन्यास प्रकाश लैंग = सी हाइलाइट = 40>
- शामिल <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;
} </वाक्यविन्यास हाइलाइट>
इस कोड में, बफ़र भेजे जाने वाले डेटा के लिए एक संकेतक है, और बफ़र_लेंथ डेटा के आकार को निर्दिष्ट करता है।
संदर्भ
- ↑ E. g. in the Ruby programming language ruby-doc::Socket
- ↑ "— POSIX.1-2008 specification". Opengroup.org. Retrieved 2012-07-26.
- ↑ "The Organization of Networks in Plan 9".
- ↑ "Linux TCP/IP stack as VFS plugin".
- ↑ Stevens & Rago 2013, p. 607.
- ↑ POSIX.1-2004
- ↑ FreeBSD Library Functions Manual –
- ↑ Conill, Ariadne (March 27, 2022). "gethostbyname की त्रासदी". ariadne.space.
- ↑ FreeBSD File Formats Manual –
- ↑ https://manpages.debian.org/experimental/ax25-tools/netrom.4.en.html.
{{cite web}}
: Missing or empty|title=
(help) - ↑ UNIX Network Programming Volume 1, Third Edition: The Sockets Networking API, W. Richard Stevens, Bill Fenner, Andrew M. Rudoff, Addison Wesley, 2003.
- ↑ "The Open Group Base Specifications Issue 7". Pubs.opengroup.org. Retrieved 2012-07-26.
- ↑ "TCP/IP raw sockets - Win32 apps".
- ↑ "बीज की नेटवर्क प्रोग्रामिंग के लिए गाइड". Beej.us. 2007-05-05. Retrieved 2012-07-26.
- ↑ "समापन सॉकेट". Softlab.ntua.gr. Retrieved 2012-07-26.
- ↑ "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 POSIX standard, known as:
- IEEE Std. 1003.1-2001 Standard for Information Technology—Portable Operating System Interface (POSIX).
- 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.
- Stevens, W. Richard; Rago, Stephen A. (May 24, 2013). Advanced Programming in the UNIX Environment (Third ed.). Addison-Wesley Professional. ISBN 978-0321637734. Retrieved 27 February 2015.