यूनिक्स सॉकेट - त्वरित गाइड

सॉकेट एक ही या अलग मशीनों पर दो अलग-अलग प्रक्रियाओं के बीच संचार की अनुमति देते हैं। अधिक सटीक होने के लिए, यह मानक यूनिक्स फ़ाइल विवरणकों का उपयोग करके अन्य कंप्यूटरों से बात करने का एक तरीका है। यूनिक्स में, प्रत्येक I / O कार्रवाई एक फाइल डिस्क्रिप्टर को लिखने या पढ़ने के द्वारा की जाती है। एक फाइल डिस्क्रिप्टर एक ओपन फाइल से जुड़ा एक पूर्णांक है और यह एक नेटवर्क कनेक्शन, एक टेक्स्ट फाइल, एक टर्मिनल, या कुछ और हो सकता है।

एक प्रोग्रामर के लिए, एक सॉकेट कम-स्तरीय फ़ाइल विवरणक की तरह दिखता है और व्यवहार करता है। ऐसा इसलिए है क्योंकि कमांड जैसे कि रीड () और राइट () सॉकेट्स के साथ उसी तरह काम करते हैं जैसे वे फाइलों और पाइपों के साथ करते हैं।

सॉकेट्स को पहले 2.1BSD में पेश किया गया था और बाद में 4.2BSD के साथ अपने वर्तमान रूप में परिष्कृत किया गया था। सॉकेट्स सुविधा अब अधिकांश वर्तमान UNIX सिस्टम रिलीज़ के साथ उपलब्ध है।

सॉकेट का उपयोग कहां किया जाता है?

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

सॉकेट प्रकार

उपयोगकर्ताओं के लिए चार प्रकार के सॉकेट उपलब्ध हैं। पहले दो सबसे अधिक उपयोग किए जाते हैं और अंतिम दो शायद ही कभी उपयोग किए जाते हैं।

प्रक्रियाओं को केवल एक ही प्रकार की सॉकेट्स के बीच संवाद करने के लिए माना जाता है लेकिन कोई प्रतिबंध नहीं है जो विभिन्न प्रकारों के सॉकेट्स के बीच संचार को रोकता है।

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

  • Datagram Sockets- नेटवर्क वाले वातावरण में डिलीवरी की गारंटी नहीं है। वे कनेक्शन रहित हैं क्योंकि आपको स्ट्रीम सॉकेट में एक खुले कनेक्शन की आवश्यकता नहीं है - आप गंतव्य जानकारी के साथ एक पैकेट का निर्माण करते हैं और इसे बाहर भेजते हैं। वे यूडीपी (उपयोगकर्ता डेटाग्राम प्रोटोकॉल) का उपयोग करते हैं।

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

  • Sequenced Packet Sockets- वे एक धारा सॉकेट के समान हैं, इस अपवाद के साथ कि रिकॉर्ड की सीमाएं संरक्षित हैं। यह इंटरफ़ेस केवल नेटवर्क सिस्टम (NS) सॉकेट एब्सट्रैक्शन के एक भाग के रूप में प्रदान किया गया है, और सबसे गंभीर NS अनुप्रयोगों में बहुत महत्वपूर्ण है। अनुक्रमित-पैकेट सॉकेट उपयोगकर्ता को पैकेट या पैकेट के समूह पर अनुक्रम पैकेट प्रोटोकॉल (SPP) या इंटरनेट डेटाग्राम प्रोटोकॉल (IDP) हेडर में हेरफेर करने की अनुमति देता है, या तो जो भी डेटा भेजा जाना है, या उसके साथ एक प्रोटोटाइप हेडर लिखकर। सभी आउटगोइंग डेटा के साथ उपयोग किए जाने वाले डिफ़ॉल्ट हेडर को निर्दिष्ट करना, और आने वाले पैकेट पर उपयोगकर्ता को हेडर प्राप्त करने की अनुमति देता है।

आगे क्या है?

अगले कुछ अध्याय आपकी मूल बातें मजबूत करने और एक नींव तैयार करने से पहले हैं, जिससे आप सॉकेट का उपयोग करके सर्वर और क्लाइंट प्रोग्राम लिख सकते हैं । यदि आप सीधे क्लाइंट और सर्वर प्रोग्राम लिखने के तरीके को देखने के लिए कूदना चाहते हैं, तो आप ऐसा कर सकते हैं लेकिन यह अनुशंसित नहीं है। यह दृढ़ता से अनुशंसा की जाती है कि आप चरण दर चरण जाएं और प्रोग्रामिंग करने के लिए आगे बढ़ने से पहले अपना आधार बनाने के लिए इन शुरुआती कुछ अध्यायों को पूरा करें।

इससे पहले कि हम वास्तविक सामान के साथ आगे बढ़ें, नेटवर्क एड्रेस - आईपी एड्रेस के बारे में थोड़ी चर्चा करें।

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

एक आईपी पता एक 32-बिट मात्रा है जिसे चार 8-बिट संख्या या ओकटेट के रूप में व्याख्या किया गया है। प्रत्येक IP पता विशिष्ट रूप से भाग लेने वाले उपयोगकर्ता नेटवर्क, नेटवर्क पर होस्ट और उपयोगकर्ता नेटवर्क के वर्ग की पहचान करता है।

एक IP पता आमतौर पर N1.N2.N3.N4 फॉर्म के बिंदीदार दशमलव संकेतन में लिखा जाता है, जहाँ प्रत्येक Ni 0 और 255 दशमलव (00 FF हेक्साडेसिमल के माध्यम से) के बीच एक दशमलव संख्या होती है।

पता कक्षाएं

IP पते इंटरनेट असाइन किए गए नंबर प्राधिकरण (IANA) द्वारा प्रबंधित और निर्मित किए जाते हैं । पाँच अलग-अलग पता वर्ग हैं। आप निर्धारित कर सकते हैं कि आईपी पते के पहले चार बिट्स की जांच करके आईपी पता किस वर्ग का है।

  • Class A पतों की शुरुआत होती है 0xxx, या 1 to 126 दशमलव।

  • Class B पतों की शुरुआत होती है 10xx, या 128 to 191 दशमलव।

  • Class C पतों की शुरुआत होती है 110x, या 192 to 223 दशमलव।

  • Class D पतों की शुरुआत होती है 1110, या 224 to 239 दशमलव।

  • Class E पतों की शुरुआत होती है 1111, या 240 to 254 दशमलव।

के साथ शुरू होने वाले पते 01111111, या 127 दशमलव, लूपबैक के लिए आरक्षित हैं और एक स्थानीय मशीन पर आंतरिक परीक्षण के लिए [आप इसका परीक्षण कर सकते हैं: आपको हमेशा पिंग करने में सक्षम होना चाहिए 127.0.0.1, जो अपने आप को इंगित करता है]; क्लास डी के पते मल्टीकास्टिंग के लिए आरक्षित हैं; कक्षा ई पते भविष्य के उपयोग के लिए आरक्षित हैं। उनका उपयोग होस्ट पते के लिए नहीं किया जाना चाहिए।

उदाहरण

Class Leftmost bits Start address Finish address
0xxx 0.0.0.0 127.255.255.255
10xx 128.0.0.0 191.255.255.255
सी 110x 192.0.0.0 223.255.255.255
1110 224.0.0.0 239.255.255.255
1111 240.0.0.0 255.255.255.255

subnetting

सबनेटिंग या सबनेटवर्किंग मूल रूप से एक नेटवर्क को बंद करने का मतलब है। यह कई कारणों से हो सकता है जैसे किसी संगठन में नेटवर्क, विभिन्न भौतिक मीडिया (जैसे ईथरनेट, एफडीडीआई, डब्ल्यूएएन, आदि) का उपयोग, पता स्थान का संरक्षण, और सुरक्षा। सबसे आम कारण नेटवर्क ट्रैफ़िक को नियंत्रित करना है।

सबनेटिंग में मूल विचार आईपी पते के मेजबान पहचानकर्ता भाग को दो भागों में विभाजित करना है -

  • नेटवर्क पते के भीतर एक सबनेट पता; तथा
  • सबनेट पर होस्ट पता।

उदाहरण के लिए, एक सामान्य वर्ग B पता प्रारूप N1.N2.SH है, जहाँ N1.N2 कक्षा B नेटवर्क की पहचान करता है, 8-बिट S फ़ील्ड सबनेट की पहचान करता है, और 8-बिट H फ़ील्ड सबनेट पर होस्ट की पहचान करता है।

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

दिए गए अल्फ़ान्यूमेरिक होस्ट नाम के आधार पर बिंदीदार आईपी पते का पता लगाने की प्रक्रिया के रूप में जाना जाता है hostname resolution

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

/ Etc / मेजबान फ़ाइल

होस्ट नाम और आईपी पते के बीच पत्राचार एक फाइल में रखा जाता है जिसे होस्ट कहा जाता है । अधिकांश प्रणालियों पर, यह फ़ाइल अंदर पाई जाती है/etc निर्देशिका।

इस फ़ाइल में प्रविष्टियाँ निम्नलिखित की तरह दिखती हैं -

# This represents a comments in /etc/hosts file.
127.0.0.1       localhost
192.217.44.207  nalanda metro
153.110.31.18   netserve
153.110.31.19   mainserver centeral
153.110.31.20   samsonite
64.202.167.10   ns3.secureserver.net
64.202.167.97   ns4.secureserver.net
66.249.89.104   www.google.com
68.178.157.132  services.amrood.com

ध्यान दें कि एक से अधिक नाम दिए गए आईपी पते के साथ जुड़े हो सकते हैं। इस फ़ाइल का उपयोग IP पते से होस्ट नाम और इसके विपरीत में कनवर्ट करते समय किया जाता है।

इस फ़ाइल को संपादित करने के लिए आपके पास पहुंच नहीं होगी, इसलिए यदि आप आईपी पते के साथ कोई होस्ट नाम रखना चाहते हैं, तो आपको रूट अनुमति की आवश्यकता होगी।

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

ग्राहक प्रक्रिया

यह प्रक्रिया है, जो आम तौर पर सूचना के लिए अनुरोध करती है। प्रतिक्रिया मिलने के बाद, यह प्रक्रिया समाप्त हो सकती है या कुछ अन्य प्रसंस्करण कर सकती है।

Example, इंटरनेट ब्राउज़र क्लाइंट एप्लिकेशन के रूप में काम करता है, जो एक HTML वेबपेज प्राप्त करने के लिए वेब सर्वर को एक अनुरोध भेजता है।

सर्वर प्रक्रिया

यह वह प्रक्रिया है जो ग्राहकों से अनुरोध लेती है। क्लाइंट से अनुरोध प्राप्त करने के बाद, यह प्रक्रिया आवश्यक प्रसंस्करण का प्रदर्शन करेगी, मांगी गई जानकारी एकत्र करेगी और इसे अनुरोधकर्ता ग्राहक को भेज देगी। एक बार हो जाने के बाद, यह दूसरे ग्राहक की सेवा के लिए तैयार हो जाता है। सर्वर प्रक्रिया हमेशा आने वाले अनुरोधों को पूरा करने के लिए सतर्क और तैयार हैं।

Example - वेब सर्वर इंटरनेट ब्राउजर के अनुरोधों का इंतजार करता रहता है और जैसे ही उसे ब्राउज़र से कोई रिक्वेस्ट मिलती है, वह एक अनुरोधित एचटीएमएल पेज को चुनता है और उस ब्राउजर में वापस भेज देता है।

ध्यान दें कि क्लाइंट को सर्वर का पता जानने की आवश्यकता है, लेकिन कनेक्शन स्थापित होने से पहले सर्वर को पता या क्लाइंट के अस्तित्व को जानने की आवश्यकता नहीं है। एक बार कनेक्शन स्थापित होने के बाद, दोनों पक्ष सूचना भेज और प्राप्त कर सकते हैं।

2-स्तरीय और 3-स्तरीय आर्किटेक्चर

दो प्रकार के क्लाइंट-सर्वर आर्किटेक्चर हैं -

  • 2-tier architecture- इस आर्किटेक्चर में, क्लाइंट सीधे सर्वर के साथ इंटरैक्ट करता है। इस प्रकार की वास्तुकला में कुछ सुरक्षा छेद और प्रदर्शन समस्याएं हो सकती हैं। इंटरनेट एक्सप्लोरर और वेब सर्वर दो स्तरीय वास्तुकला पर काम करते हैं। यहां सिक्योर सॉकेट लेयर (एसएसएल) का उपयोग कर सुरक्षा समस्याओं का समाधान किया जाता है।

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

सर्वर के प्रकार

आपके पास दो प्रकार के सर्वर हो सकते हैं -

  • Iterative Server- यह सर्वर का सबसे सरल रूप है जहां एक सर्वर प्रक्रिया एक क्लाइंट को सेवा देती है और पहला अनुरोध पूरा करने के बाद, यह दूसरे क्लाइंट से अनुरोध लेती है। इस बीच, एक और ग्राहक इंतजार करता रहता है।

  • Concurrent Servers- इस प्रकार का सर्वर एक बार में कई अनुरोधों को पूरा करने के लिए कई समवर्ती प्रक्रियाएं चलाता है क्योंकि एक प्रक्रिया में अधिक समय लग सकता है और दूसरा ग्राहक इतने लंबे समय तक इंतजार नहीं कर सकता है। यूनिक्स के तहत एक समवर्ती सर्वर लिखने का सबसे सरल तरीका प्रत्येक ग्राहक को अलग से संभालने के लिए एक बच्चे की प्रक्रिया को कांटा करना है।

क्लाइंट कैसे बनाये

कनेक्शन स्थापित करने के लिए सिस्टम कॉल क्लाइंट और सर्वर के लिए कुछ अलग हैं, लेकिन दोनों एक सॉकेट के मूल निर्माण को शामिल करते हैं। दोनों प्रक्रियाएं अपनी-अपनी कुर्सियां ​​स्थापित करती हैं।

क्लाइंट साइड पर सॉकेट स्थापित करने में शामिल कदम इस प्रकार हैं -

  • के साथ एक सॉकेट बनाएं socket() सिस्टम कॉल।

  • सर्वर का उपयोग करके सर्वर के पते पर सॉकेट कनेक्ट करें connect() सिस्टम कॉल।

  • डेटा भेजें और प्राप्त करें। इसे करने के कई तरीके हैं, लेकिन सबसे सरल तरीका है इसका उपयोग करनाread() तथा write() सिस्टम कॉल।

सर्वर कैसे बनाते है

सर्वर साइड पर सॉकेट स्थापित करने में शामिल कदम इस प्रकार हैं -

  • के साथ एक सॉकेट बनाएं socket() सिस्टम कॉल।

  • सॉकेट को किसी पते के उपयोग से बांधें bind()सिस्टम कॉल। इंटरनेट पर एक सर्वर सॉकेट के लिए, एक पता होस्ट मशीन पर एक पोर्ट नंबर होता है।

  • के साथ कनेक्शन के लिए सुनो listen() सिस्टम कॉल।

  • के साथ एक कनेक्शन स्वीकार करें accept()सिस्टम कॉल। यह कॉल आम तौर पर तब तक कनेक्शन को ब्लॉक करता है जब तक कोई क्लाइंट सर्वर से कनेक्ट नहीं होता है।

  • का उपयोग करके डेटा भेजें और प्राप्त करें read() तथा write() सिस्टम कॉल।

क्लाइंट और सर्वर इंटरेक्शन

निम्नलिखित क्लाइंट और सर्वर इंटरैक्शन को दर्शाने वाला आरेख है -

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

sockaddr

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

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

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

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

AF_INET

AF_UNIX

AF_NS

AF_IMPLINK

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

Sockaddr में

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

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

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

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

AF_INET

AF_UNIX

AF_NS

AF_IMPLINK

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

Addr में

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

struct in_addr {
   unsigned long s_addr;
};

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

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

hostent

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

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

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

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

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

नौकर

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

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

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

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

टीसीपी

यूडीपी

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

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

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

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

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

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

जब क्लाइंट प्रक्रिया किसी सर्वर से कनेक्ट करना चाहती है, तो क्लाइंट के पास उस सर्वर को पहचानने का एक तरीका होना चाहिए जिसे वह कनेक्ट करना चाहता है। यदि क्लाइंट होस्ट का 32-बिट इंटरनेट पता जानता है जिस पर सर्वर रहता है, तो वह उस होस्ट से संपर्क कर सकता है। लेकिन क्लाइंट उस होस्ट पर चलने वाली विशेष सर्वर प्रक्रिया की पहचान कैसे करता है?

होस्ट पर चल रहे किसी विशेष सर्वर प्रक्रिया की पहचान करने की समस्या को हल करने के लिए, टीसीपी और यूडीपी दोनों ने प्रसिद्ध बंदरगाहों के एक समूह को परिभाषित किया है।

हमारे उद्देश्य के लिए, एक पोर्ट को 1024 और 65535 के बीच पूर्णांक संख्या के रूप में परिभाषित किया जाएगा। ऐसा इसलिए है क्योंकि 1024 से छोटे सभी पोर्ट संख्याओं को अच्छी तरह से जाना जाता है - उदाहरण के लिए, टेलनेट पोर्ट 23 का उपयोग करता है, http 80 का उपयोग करता है, ftp 21 का उपयोग करता है, और इसी तरह।

नेटवर्क सेवाओं में पोर्ट असाइनमेंट फ़ाइल / etc / सेवाओं में पाया जा सकता है। यदि आप अपना स्वयं का सर्वर लिख रहे हैं तो अपने सर्वर पर पोर्ट असाइन करने के लिए सावधानी बरतनी चाहिए। आपको यह सुनिश्चित करना चाहिए कि यह पोर्ट किसी अन्य सर्वर को नहीं सौंपा जाना चाहिए।

आम तौर पर यह 5000 से अधिक किसी भी पोर्ट संख्या को निर्दिष्ट करने के लिए एक प्रथा है। लेकिन कई संगठन ऐसे हैं, जिनके पास 5000 से अधिक पोर्ट संख्या वाले सर्वर हैं। उदाहरण के लिए, याहू मैसेंजर 5050 पर चलता है, एसआईपी सर्वर 5060 पर चलता है, आदि।

उदाहरण बंदरगाहों और सेवाओं

यहां सेवाओं और संबंधित बंदरगाहों की एक छोटी सूची है। आप इंटरनेट पोर्ट्स और संबंधित सेवा की सबसे अद्यतन सूची IANA - TCP / IP पोर्ट असाइनमेंट पर पा सकते हैं ।

Service Port Number Service Description
गूंज 7 यूडीपी / टीसीपी वापस भेजता है जो इसे प्राप्त करता है।
रद्द करें 9 यूडीपी / टीसीपी दूर इनपुट फेंकता है।
दिन 13 यूडीपी / टीसीपी एएससीआईआई समय देता है।
chargen 19 UDP / TCP वर्ण लौटाता है।
एफ़टीपी 21 टीसीपी फ़ाइल स्थानांतरण।
टेलनेट 23 टीसीपी रिमोट लॉगिन।
एसएमटीपी 25 टीसीपी ईमेल।
दिन 37 यूडीपी / टीसीपी द्विआधारी समय देता है।
TFTP 69 यूडीपी तुच्छ फ़ाइल स्थानांतरण।
उंगली 79 उपयोगकर्ताओं पर टीसीपी जानकारी।
एचटीटीपी 80 टीसीपी वर्ल्ड वाइड वेब।
लॉग इन करें 513 टीसीपी रिमोट लॉगिन।
who 513 यूडीपी उपयोगकर्ताओं पर विभिन्न जानकारी।
स्वागत 6000 टीसीपी एक्स विंडोज़ (एनबी> 1023)।

पोर्ट और सेवा कार्य

यूनिक्स / etc / सेवाओं फ़ाइल से सेवा का नाम लाने के लिए निम्नलिखित कार्य प्रदान करता है।

  • struct servent *getservbyname(char *name, char *proto) - यह कॉल सेवा नाम और प्रोटोकॉल नाम लेता है, और उस सेवा के लिए संबंधित पोर्ट नंबर देता है।

  • struct servent *getservbyport(int port, char *proto) - यह कॉल पोर्ट नंबर और प्रोटोकॉल नाम लेता है, और संबंधित सेवा का नाम देता है।

प्रत्येक फ़ंक्शन के लिए वापसी मान निम्न फॉर्म के साथ एक संरचना के लिए एक संकेतक है -

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

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

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

टीसीपी

यूडीपी

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

दुर्भाग्य से, सभी कंप्यूटर बाइट्स को संग्रहीत नहीं करते हैं जिसमें एक ही क्रम में एक मल्टीबाइट मान शामिल होता है। एक 16-बिट इंटरनेट पर विचार करें जो 2 बाइट्स से बना है। इस मान को संग्रहीत करने के दो तरीके हैं।

  • Little Endian - इस योजना में, कम-ऑर्डर बाइट को शुरुआती पते (ए) पर संग्रहीत किया जाता है और उच्च-क्रम बाइट को अगले पते (ए + 1) पर संग्रहीत किया जाता है।

  • Big Endian - इस योजना में, उच्च-क्रम बाइट को प्रारंभिक पते (ए) पर संग्रहीत किया जाता है और निम्न-क्रम बाइट को अगले पते (ए + 1) पर संग्रहीत किया जाता है।

अलग-अलग बाइट ऑर्डर सम्मेलनों के साथ मशीनों को एक-दूसरे के साथ संवाद करने की अनुमति देने के लिए, इंटरनेट प्रोटोकॉल नेटवर्क पर प्रसारित डेटा के लिए एक कैनॉनिकल बाइट ऑर्डर सम्मेलन निर्दिष्ट करते हैं। इसे नेटवर्क बाइट ऑर्डर के रूप में जाना जाता है।

इंटरनेट सॉकेट कनेक्शन की स्थापना करते समय, आपको यह सुनिश्चित करना होगा कि sockaddr_in संरचना के sin_port और sin_addr सदस्यों में डेटा नेटवर्क बाइट ऑर्डर में दर्शाया गया है।

बाइट ऑर्डरिंग फ़ंक्शंस

एक मेजबान के आंतरिक प्रतिनिधित्व और नेटवर्क बाइट ऑर्डर के बीच डेटा परिवर्तित करने के लिए रूट निम्नानुसार हैं -

समारोह विवरण
htons () नेटवर्क शॉर्ट को होस्ट करें
htonl () नेटवर्क लॉन्ग को होस्ट करें
ntohl () नेटवर्क लंबे होस्ट करने के लिए
ntohs () नेटवर्क होस्ट करने के लिए लघु

नीचे सूचीबद्ध इन कार्यों के बारे में कुछ और विवरण हैं -

  • unsigned short htons(unsigned short hostshort) - यह फ़ंक्शन होस्ट बाइट ऑर्डर से नेटवर्क बाइट ऑर्डर तक 16-बिट (2-बाइट) मात्रा में कनवर्ट करता है।

  • unsigned long htonl(unsigned long hostlong) - यह फ़ंक्शन होस्ट बाइट ऑर्डर से 32-बिट (4-बाइट) मात्रा को नेटवर्क बाइट ऑर्डर में कनवर्ट करता है।

  • unsigned short ntohs(unsigned short netshort) - यह फ़ंक्शन नेटवर्क बाइट ऑर्डर से 16-बिट (2-बाइट) मात्रा को बाइट ऑर्डर में परिवर्तित करता है।

  • unsigned long ntohl(unsigned long netlong) - यह फ़ंक्शन नेटवर्क बाइट ऑर्डर से 32-बिट मात्रा को बाइट ऑर्डर होस्ट करने के लिए कनवर्ट करता है।

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

होस्ट बाइट ऑर्डर निर्धारित करने का कार्यक्रम

एक फ़ाइल byteorder.c में निम्नलिखित कोड रखें और फिर इसे संकलित करें और इसे अपनी मशीन पर चलाएं।

इस उदाहरण में, हम दो-बाइट मान 0x0102 को लघु पूर्णांक में संग्रहीत करते हैं और फिर बाइट को निर्धारित करने के लिए दो लगातार बाइट्स, सी [0] (एड्रेस ए) और सी [1] (एड्रेस ए + 1) को देखते हैं। गण।

#include <stdio.h>

int main(int argc, char **argv) {

   union {
      short s;
      char c[sizeof(short)];
   }un;
	
   un.s = 0x0102;
   
   if (sizeof(short) == 2) {
      if (un.c[0] == 1 && un.c[1] == 2)
         printf("big-endian\n");
      
      else if (un.c[0] == 2 && un.c[1] == 1)
         printf("little-endian\n");
      
      else
         printf("unknown\n");
   }
   else {
      printf("sizeof(short) = %d\n", sizeof(short));
   }
	
   exit(0);
}

एक पेंटियम मशीन पर इस कार्यक्रम द्वारा उत्पन्न एक आउटपुट निम्नानुसार है -

$> gcc byteorder.c $> ./a.out
little-endian
$>

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

निम्नलिखित तीन फ़ंक्शन कॉल IPv4 एड्रेसिंग के लिए उपयोग किए जाते हैं -

  • int inet_aton (const char * strptr, struct in_addr * addrptr)
  • in_addr_t inet_addr (const char * strptr)
  • चार * inet_ntoa (संरचना in_addr inaddr)

int inet_aton (const char * strptr, struct in_addr * addrptr)

यह फ़ंक्शन कॉल इंटरनेट मानक डॉट नोटेशन में निर्दिष्ट स्ट्रिंग को नेटवर्क पते पर कनवर्ट करता है, और प्रदान की गई संरचना में पते को संग्रहीत करता है। परिवर्तित पता नेटवर्क बाइट ऑर्डर (बाइट्स को दाईं ओर से ऑर्डर किया गया) में होगा। यह 1 लौटाता है यदि स्ट्रिंग वैध थी और त्रुटि पर 0।

निम्नलिखित उपयोग उदाहरण है -

#include <arpa/inet.h>

(...)

   int retval;
   struct in_addr addrptr
   
   memset(&addrptr, '\0', sizeof(addrptr));
   retval = inet_aton("68.178.157.132", &addrptr);

(...)

in_addr_t inet_addr (const char * strptr)

यह फ़ंक्शन कॉल इंटरनेट मानक डॉट नोटेशन में निर्दिष्ट स्ट्रिंग को इंटरनेट पते के रूप में उपयोग करने के लिए उपयुक्त पूर्णांक मान में कनवर्ट करता है। परिवर्तित पता नेटवर्क बाइट ऑर्डर (बाइट्स को दाईं ओर से ऑर्डर किया गया) में होगा। यह एक 32-बिट बाइनरी नेटवर्क बाइट आदेश IPv4 पता और INADDR_NONE त्रुटि पर दिया।

निम्नलिखित उपयोग उदाहरण है -

#include <arpa/inet.h>

(...)

   struct sockaddr_in dest;

   memset(&dest, '\0', sizeof(dest));
   dest.sin_addr.s_addr = inet_addr("68.178.157.132");
   
(...)

चार * inet_ntoa (संरचना in_addr inaddr)

यह फ़ंक्शन कॉल इंटरनेट मानक डॉट नोटेशन में निर्दिष्ट इंटरनेट होस्ट पते को स्ट्रिंग में कनवर्ट करता है।

निम्नलिखित उपयोग उदाहरण है -

#include <arpa/inet.h>

(...)

   char *ip;
   
   ip = inet_ntoa(dest.sin_addr);
   
   printf("IP Address is: %s\n",ip);
   
(...)

यह अध्याय एक पूर्ण टीसीपी क्लाइंट और सर्वर लिखने के लिए आवश्यक कोर सॉकेट फ़ंक्शन का वर्णन करता है।

निम्नलिखित चित्र पूर्ण क्लाइंट और सर्वर इंटरैक्शन दिखाता है -

सॉकेट फंक्शन

नेटवर्क I / O निष्पादित करने के लिए, पहली चीज जो एक प्रक्रिया को करना चाहिए, वह सॉकेट फ़ंक्शन को कॉल करना, संचार प्रोटोकॉल के प्रकार को निर्दिष्ट करना और प्रोटोकॉल परिवार, आदि।

#include <sys/types.h>
#include <sys/socket.h>

int socket (int family, int type, int protocol);

यह कॉल एक सॉकेट डिस्क्रिप्टर देता है जिसे आप बाद में सिस्टम कॉल या त्रुटि पर -1 में उपयोग कर सकते हैं।

मापदंडों

family - यह प्रोटोकॉल परिवार को निर्दिष्ट करता है और नीचे दिखाए गए स्थिरांक में से एक है -

परिवार विवरण
AF_INET IPv4 प्रोटोकॉल
AF_INET6 IPv6 प्रोटोकॉल
AF_LOCAL यूनिक्स डोमेन प्रोटोकॉल
AF_ROUTE रूटिंग सॉकेट्स
AF_KEY केट सॉकेट

यह अध्याय IPv4 को छोड़कर अन्य प्रोटोकॉल को कवर नहीं करता है।

type- यह आपके इच्छित सॉकेट को निर्दिष्ट करता है। यह निम्न में से एक मान ले सकता है -

प्रकार विवरण
SOCK_STREAM स्ट्रीम सॉकेट
SOCK_DGRAM डाटाग्राम सॉकेट
SOCK_SEQPACKET जब्त पैकेट सॉकेट
SOCK_RAW कच्चा सॉकेट

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

मसविदा बनाना विवरण
IPPROTO_TCP टीसीपी परिवहन प्रोटोकॉल
IPPROTO_UDP यूडीपी परिवहन प्रोटोकॉल
IPPROTO_SCTP SCTP परिवहन प्रोटोकॉल

कनेक्ट समारोह

कनेक्ट समारोह एक टीसीपी सर्वर के साथ कनेक्शन स्थापित करने के लिए एक टीसीपी ग्राहक द्वारा प्रयोग किया जाता है।

#include <sys/types.h>
#include <sys/socket.h>

int connect(int sockfd, struct sockaddr *serv_addr, int addrlen);

यदि यह सफलतापूर्वक सर्वर से जुड़ जाता है, तो यह कॉल 0 देता है, अन्यथा यह त्रुटि पर -1 देता है।

मापदंडों

  • sockfd - यह सॉकेट फ़ंक्शन द्वारा लौटाया गया सॉकेट डिस्क्रिप्टर है।

  • serv_addr - यह संरचित सॉकड्रेड के लिए एक संकेतक है जिसमें गंतव्य आईपी पता और पोर्ट होता है।

  • addrlen - इसे आकार-प्रकार (स्ट्रक्चर सॉकड्रेड) पर सेट करें।

बाँध समारोह

बाँध समारोह सॉकेट के लिए एक स्थानीय प्रोटोकॉल पता प्रदान करती है। इंटरनेट प्रोटोकॉल के साथ, प्रोटोकॉल एड्रेस 16-बिट टीसीपी या यूडीपी पोर्ट नंबर के साथ 32-बिट IPv4 एड्रेस या 128-बिट IPv6 एड्रेस का संयोजन है। यह फ़ंक्शन केवल टीसीपी सर्वर द्वारा कहा जाता है।

#include <sys/types.h>
#include <sys/socket.h>

int bind(int sockfd, struct sockaddr *my_addr,int addrlen);

यह कॉल 0 पर वापस लौटता है यदि यह सफलतापूर्वक पते से जुड़ता है, अन्यथा यह त्रुटि पर -1 देता है।

मापदंडों

  • sockfd - यह सॉकेट फ़ंक्शन द्वारा लौटाया गया सॉकेट डिस्क्रिप्टर है।

  • my_addr - यह स्थानीय आईपी पते और पोर्ट वाले sockaddr के लिए एक पॉइंटर है।

  • addrlen - इसे आकार-प्रकार (स्ट्रक्चर सॉकड्रेड) पर सेट करें।

आप अपने आईपी पते और अपने पोर्ट को स्वचालित रूप से रख सकते हैं

पोर्ट नंबर के लिए 0 मान का अर्थ है कि सिस्टम एक यादृच्छिक पोर्ट का चयन करेगा, और IP पते के लिए INADDR_ANY मान का अर्थ है कि सर्वर का आईपी पता स्वचालित रूप से असाइन किया जाएगा।

server.sin_port = 0;  		     
server.sin_addr.s_addr = INADDR_ANY;

NOTE- 1024 से नीचे के सभी पोर्ट आरक्षित हैं। आप 1024 से ऊपर और 65535 से नीचे एक पोर्ट सेट कर सकते हैं जब तक कि वे अन्य कार्यक्रमों द्वारा उपयोग किए जाने वाले नहीं हैं।

सुनने समारोह

सुनने समारोह केवल एक TCP सर्वर से पुकारा जाता है और यह दो कार्य करता है -

  • सुनने का कार्य एक असंबद्ध सॉकेट को एक निष्क्रिय सॉकेट में परिवर्तित करता है, यह दर्शाता है कि कर्नेल को इस सॉकेट के लिए आने वाले कनेक्शन अनुरोधों को स्वीकार करना चाहिए।

  • इस फ़ंक्शन का दूसरा तर्क निर्दिष्ट करता है कि इस सॉकेट के लिए कर्नेल को कतार में अधिकतम कनेक्शन चाहिए।

#include <sys/types.h>
#include <sys/socket.h>

int listen(int sockfd,int backlog);

यह कॉल सफलता पर 0 रिटर्न देता है, अन्यथा यह त्रुटि पर -1 देता है।

मापदंडों

  • sockfd - यह सॉकेट फ़ंक्शन द्वारा लौटाया गया सॉकेट डिस्क्रिप्टर है।

  • backlog - यह अनुमत कनेक्शनों की संख्या है।

स्वीकार समारोह

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

#include <sys/types.h>
#include <sys/socket.h>

int accept (int sockfd, struct sockaddr *cliaddr, socklen_t *addrlen);

यह कॉल सफलता पर एक गैर-नकारात्मक विवरणक देता है, अन्यथा यह त्रुटि पर -1 देता है। लौटे डिस्क्रिप्टर को एक क्लाइंट सॉकेट डिस्क्रिप्टर माना जाता है और क्लाइंट के साथ संवाद करने के लिए इस डिस्क्रिप्टर पर सभी रीड-राइट ऑपरेशन किए जाएंगे।

मापदंडों

  • sockfd - यह सॉकेट फ़ंक्शन द्वारा लौटाया गया सॉकेट डिस्क्रिप्टर है।

  • cliaddr - यह sockaddr को संरचित करने के लिए एक पॉइंटर है जिसमें क्लाइंट IP एड्रेस और पोर्ट होता है।

  • addrlen - इसे आकार-प्रकार (स्ट्रक्चर सॉकड्रेड) पर सेट करें।

भेजने समारोह

भेजने समारोह धारा सॉकेट या कनेक्ट किए गए आंकड़ारेख सॉकेट पर डेटा भेजने के लिए इस्तेमाल किया जाता है। यदि आप UNCONNECTED डेटाग्राम सॉकेट पर डेटा भेजना चाहते हैं, तो आपको sendto () फ़ंक्शन का उपयोग करना होगा।

डेटा भेजने के लिए आप राइट () सिस्टम कॉल का उपयोग कर सकते हैं । इसका हस्ताक्षर इस प्रकार है -

int send(int sockfd, const void *msg, int len, int flags);

यह कॉल बाहर भेजे गए बाइट्स की संख्या लौटाता है, अन्यथा यह त्रुटि पर -1 वापस आ जाएगा।

मापदंडों

  • sockfd - यह सॉकेट फ़ंक्शन द्वारा लौटाया गया सॉकेट डिस्क्रिप्टर है।

  • msg - यह उस डेटा के लिए एक पॉइंटर है जिसे आप भेजना चाहते हैं।

  • len - यह उस डेटा की लंबाई है जिसे आप भेजना चाहते हैं (बाइट्स में)।

  • flags - यह 0 पर सेट है।

recv समारोह

Recv समारोह धारा सॉकेट या कनेक्ट किए गए आंकड़ारेख सॉकेट पर डेटा प्राप्त करने के लिए प्रयोग किया जाता है। यदि आप UNCONNECTED डेटाग्राम सॉकेट पर डेटा प्राप्त करना चाहते हैं, तो आपको recvfrom () का उपयोग करना होगा।

डेटा पढ़ने के लिए आप रीड () सिस्टम कॉल का उपयोग कर सकते हैं । इस कॉल को सहायक कार्यों के अध्याय में समझाया गया है।

int recv(int sockfd, void *buf, int len, unsigned int flags);

यह कॉल बफ़र में पढ़ी गई बाइट्स की संख्या को लौटाता है, अन्यथा यह त्रुटि पर -1 वापस आ जाएगी।

मापदंडों

  • sockfd - यह सॉकेट फ़ंक्शन द्वारा लौटाया गया सॉकेट डिस्क्रिप्टर है।

  • buf - यह जानकारी में पढ़ने के लिए बफर है।

  • len - यह बफर की अधिकतम लंबाई है।

  • flags - यह 0 पर सेट है।

सेंडटो फंक्शन

Sendto समारोह असंबद्ध आंकड़ारेख सॉकेट पर डेटा भेजने के लिए इस्तेमाल किया जाता है। इसका हस्ताक्षर इस प्रकार है -

int sendto(int sockfd, const void *msg, int len, unsigned int flags, const struct sockaddr *to, int tolen);

यह कॉल भेजे गए बाइट्स की संख्या को लौटाता है, अन्यथा यह त्रुटि पर -1 देता है।

मापदंडों

  • sockfd - यह सॉकेट फ़ंक्शन द्वारा लौटाया गया सॉकेट डिस्क्रिप्टर है।

  • msg - यह उस डेटा के लिए एक पॉइंटर है जिसे आप भेजना चाहते हैं।

  • len - यह उस डेटा की लंबाई है जिसे आप भेजना चाहते हैं (बाइट्स में)।

  • flags - यह 0 पर सेट है।

  • to - यह होस्ट के लिए सॉकड्रेड को संरचित करने के लिए एक संकेतक है जहां डेटा भेजा जाना है।

  • tolen - यह इसे आकार-प्रकार (स्ट्रक्चर सॉकड्रेड) के लिए सेट किया गया है।

recvfrom समारोह

Recvfrom समारोह असंबद्ध आंकड़ारेख सॉकेट से डेटा प्राप्त किया जाता है।

int recvfrom(int sockfd, void *buf, int len, unsigned int flags struct sockaddr *from, int *fromlen);

यह कॉल बफ़र में पढ़ी गई बाइट्स की संख्या को लौटाता है, अन्यथा यह त्रुटि पर -1 देता है।

मापदंडों

  • sockfd - यह सॉकेट फ़ंक्शन द्वारा लौटाया गया सॉकेट डिस्क्रिप्टर है।

  • buf - यह जानकारी में पढ़ने के लिए बफर है।

  • len - यह बफर की अधिकतम लंबाई है।

  • flags - यह 0 पर सेट है।

  • from - यह होस्ट के लिए सॉकड्रेड को संरचित करने के लिए एक संकेतक है जहां डेटा को पढ़ना पड़ता है।

  • fromlen - यह इसे आकार-प्रकार (स्ट्रक्चर सॉकड्रेड) के लिए सेट किया गया है।

करीब समारोह

करीब समारोह क्लाइंट और सर्वर के बीच संचार को बंद करने के लिए किया जाता है। इसका सिंटैक्स इस प्रकार है -

int close( int sockfd );

यह कॉल सफलता पर 0 रिटर्न देता है, अन्यथा यह त्रुटि पर -1 देता है।

मापदंडों

  • sockfd - यह सॉकेट फ़ंक्शन द्वारा लौटाया गया सॉकेट डिस्क्रिप्टर है।

बंद समारोह

शटडाउन समारोह शान से क्लाइंट और सर्वर के बीच संचार को बंद करने के लिए किया जाता है। यह फ़ंक्शन नजदीकी फ़ंक्शन की तुलना में अधिक नियंत्रण देता है। नीचे दिए गए शटडाउन का सिंटैक्स है -

int shutdown(int sockfd, int how);

यह कॉल सफलता पर 0 रिटर्न देता है, अन्यथा यह त्रुटि पर -1 देता है।

मापदंडों

  • sockfd - यह सॉकेट फ़ंक्शन द्वारा लौटाया गया सॉकेट डिस्क्रिप्टर है।

  • how - संख्याओं में से एक डालें -

    • 0 - इंगित करता है कि प्राप्त करने की अनुमति नहीं है,

    • 1 - इंगित करता है कि भेजने की अनुमति नहीं है, और

    • 2- इंगित करता है कि भेजने और प्राप्त करने दोनों की अनुमति नहीं है। जब कैसे 2 के लिए सेट है, यह पास के रूप में एक ही बात है ()।

फ़ंक्शन का चयन करें

चुनिंदा समारोह को इंगित करता है जो निर्दिष्ट फ़ाइल वर्णनकर्ता के लेखन के लिए, पढ़ने के लिए तैयार के लिए तैयार है, या एक त्रुटि स्थिति लंबित है।

जब कोई एप्लिकेशन recv या recvfrom को कॉल करता है, तो इसे तब तक ब्लॉक किया जाता है जब तक उस सॉकेट के लिए डेटा नहीं आ जाता है। एक एप्लिकेशन अन्य उपयोगी प्रसंस्करण कर सकता है जबकि आने वाली डेटा स्ट्रीम खाली है। एक अन्य स्थिति तब होती है जब कोई एप्लिकेशन कई सॉकेट से डेटा प्राप्त करता है।

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

नीचे दिए गए चयन का वाक्य विन्यास है -

int select(int  nfds, fd_set  *readfds, fd_set  *writefds, fd_set *errorfds, struct timeval *timeout);

यह कॉल सफलता पर 0 रिटर्न देता है, अन्यथा यह त्रुटि पर -1 देता है।

मापदंडों

  • nfds- यह परीक्षण किए जाने वाले फ़ाइल डिस्क्रिप्टर की सीमा को निर्दिष्ट करता है। फंक्शन () फंक्शन टेस्ट फाइल डिस्क्रिप्टर को 0 से nfds-1 की रेंज में बताता है

  • readfds- यह एक प्रकार के ऑब्जेक्ट के लिए इंगित करता है fd_set जो इनपुट पर, फ़ाइल डिस्क्रिप्टर को पढ़ने के लिए तैयार होने के लिए जाँच करने के लिए निर्दिष्ट करता है, और आउटपुट पर, यह इंगित करता है कि कौन से फ़ाइल डिस्क्रिप्टर पढ़ने के लिए तैयार हैं। खाली सेट को इंगित करना NULL हो सकता है।

  • writefds- यह टाइप fd_set के ऑब्जेक्ट को इंगित करता है कि इनपुट पर, फ़ाइल डिस्क्रिप्टर को लिखने के लिए तैयार होने के लिए जाँचने के लिए निर्दिष्ट करता है, और आउटपुट पर, यह इंगित करता है कि कौन से फाइल डिस्क्रिप्टर लिखने के लिए तैयार हैं। खाली सेट को इंगित करना NULL हो सकता है।

  • exceptfds- यह टाइप fd_set के ऑब्जेक्ट को इंगित करता है कि इनपुट पर, लंबित त्रुटि स्थितियों की जाँच के लिए फ़ाइल डिस्क्रिप्टर निर्दिष्ट करता है, और आउटपुट इंगित करता है कि किस फाइल डिस्क्रिप्टर में त्रुटि की स्थिति लंबित है। खाली सेट को इंगित करना NULL हो सकता है।

  • timeout- यह एक टाइमवेल स्ट्रक्चर की ओर इशारा करता है जो यह निर्दिष्ट करता है कि उपलब्ध आई / ओ ऑपरेशन के लिए डिलेक्टर्स को कितने समय के लिए कॉल का चयन करना चाहिए। यदि टाइमआउट मान 0 है, तो चयन तुरंत वापस आ जाएगा। यदि टाइमआउट तर्क NULL है, तो तब तक चयन करें जब तक कि उपलब्ध I / O ऑपरेशन के लिए कम से कम एक फ़ाइल / सॉकेट हैंडल तैयार न हो जाए। अन्यथा चयन समय समाप्त होने के बाद वापस आ जाएगा या जब कम से कम एक फ़ाइल / सॉकेट डिस्क्रिप्टर I / O ऑपरेशन के लिए तैयार है।

चयन से वापसी मान फ़ाइल डिस्क्रिप्टर सेट में निर्दिष्ट हैंडल की संख्या है जो I / O के लिए तैयार हैं। यदि टाइमआउट फ़ील्ड द्वारा निर्दिष्ट समय सीमा समाप्त हो गई है, तो रिटर्न 0. का चयन करें। फ़ाइल विवरणक सेट में हेरफेर करने के लिए निम्न मैक्रोज़ मौजूद हैं -

  • FD_CLR(fd, &fdset)- फ़ाइल डिस्क्रिप्टर सेट fdset में फ़ाइल डिस्क्रिप्टर fd के लिए बिट को साफ़ करता है

  • FD_ISSET(fd, &fdset)- गैर-शून्य मान लौटाता है यदि फ़ाइल डिस्क्रिप्टर fd के लिए बिट फ़ाइल डिस्क्रिप्टर सेट में fdset द्वारा इंगित किया गया है , और 0 अन्यथा।

  • FD_SET(fd, &fdset) - फाइल डिस्क्रिप्टर सेट fdset में फाइल डिस्क्रिप्टर fd के लिए बिट सेट करता है।

  • FD_ZERO(&fdset) - फ़ाइल डिस्क्रिप्टर सेट fdset को सभी फ़ाइल डिस्क्रिप्टर के लिए शून्य बिट्स के लिए प्रारंभ करता है।

अगर fd तर्क 0 से कम है या FD_SETSIIE से अधिक है तो इन मैक्रोज़ का व्यवहार अपरिभाषित है।

उदाहरण

fd_set fds;

struct timeval tv;

/* do socket initialization etc.
tv.tv_sec = 1;
tv.tv_usec = 500000;

/* tv now represents 1.5 seconds */
FD_ZERO(&fds);

/* adds sock to the file descriptor set */
FD_SET(sock, &fds); 

/* wait 1.5 seconds for any data to be read from any single socket */
select(sock+1, &fds, NULL, NULL, &tv);

if (FD_ISSET(sock, &fds)) {
   recvfrom(s, buffer, buffer_len, 0, &sa, &sa_len);
   /* do something */
}
else {
   /* do something else */
}

यह अध्याय सभी सहायक कार्यों का वर्णन करता है, जो सॉकेट प्रोग्रामिंग करते समय उपयोग किए जाते हैं। अन्य सहायक कार्यों को अध्याय में वर्णित किया गया है -Ports and Services, और नेटवर्क Byte Orders

लिखने समारोह

लिखने बफर से लिखने nbyte बाइट्स समारोह के प्रयास से बताया buf खुले फ़ाइल वर्णनकर्ता, के साथ जुड़े फाइल करने के लिए fildes

आप किसी अन्य प्रक्रिया में डेटा भेजने के लिए सेंड () फ़ंक्शन का भी उपयोग कर सकते हैं ।

#include <unistd.h>

int write(int fildes, const void *buf, int nbyte);

सफल समापन पर, लिखने () वास्तव में फ़ाइल के साथ जुड़े फ़ाइल को लिखी गई बाइट्स की संख्या देता है। यह संख्या कभी भी निबटे से अधिक नहीं है। अन्यथा, -1 लौटा दिया जाता है।

मापदंडों

  • fildes - यह सॉकेट फ़ंक्शन द्वारा लौटाया गया सॉकेट डिस्क्रिप्टर है।

  • buf - यह उस डेटा के लिए एक पॉइंटर है जिसे आप भेजना चाहते हैं।

  • nbyte- यह लिखा जाने वाला बाइट्स की संख्या है। यदि nbyte 0 है, तो लिखो () 0 वापस आ जाएगी और कोई अन्य परिणाम नहीं है यदि फ़ाइल एक नियमित फ़ाइल है; अन्यथा, परिणाम अनिर्दिष्ट हैं।

पढ़ने समारोह

पढ़ने समारोह प्रयास बफर, fildes के साथ जुड़े फ़ाइल से nbyte बाइट्स पढ़ने के लिए, में बफर buf द्वारा की ओर इशारा किया।

डेटा को किसी अन्य प्रक्रिया में पढ़ने के लिए आप recv () फ़ंक्शन का भी उपयोग कर सकते हैं ।

#include <unistd.h>

int read(int fildes, const void *buf, int nbyte);

सफल समापन पर, लिखने () वास्तव में फ़ाइल के साथ जुड़े फ़ाइल को लिखी गई बाइट्स की संख्या देता है। यह संख्या कभी भी निबटे से अधिक नहीं है। अन्यथा, -1 लौटा दिया जाता है।

मापदंडों

  • fildes - यह सॉकेट फ़ंक्शन द्वारा लौटाया गया सॉकेट डिस्क्रिप्टर है।

  • buf - यह जानकारी में पढ़ने के लिए बफर है।

  • nbyte - यह पढ़ने के लिए बाइट्स की संख्या है।

कांटा समारोह

कांटा समारोह एक नई प्रक्रिया पैदा करता है। नई प्रक्रिया जिसे चाइल्ड प्रोसेस कहा जाता है, कॉलिंग प्रक्रिया (मूल प्रक्रिया) की एक सटीक प्रतिलिपि होगी। बच्चे की प्रक्रिया मूल प्रक्रिया से कई विशेषताओं को विरासत में मिली है।

#include <sys/types.h>
#include <unistd.h>

int fork(void);

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

मापदंडों

  • void - इसका मतलब है कि किसी पैरामीटर की आवश्यकता नहीं है।

bzero समारोह

Bzero समारोह स्थानों nbyte अशक्त स्ट्रिंग में बाइट्स रों । इस फ़ंक्शन का उपयोग अशक्त मानों के साथ सभी सॉकेट संरचनाओं को सेट करने के लिए किया जाता है।

void bzero(void *s, int nbyte);

यह फ़ंक्शन कुछ भी वापस नहीं करता है।

मापदंडों

  • s- यह स्ट्रिंग को निर्दिष्ट करता है जिसे नल बाइट्स से भरना होता है। यह सॉकेट संरचना चर का एक बिंदु होगा।

  • nbyte- यह शून्य मानों की संख्या को शून्य मानों से भरा हुआ बताता है। यह सॉकेट संरचना का आकार होगा।

bcmp समारोह

Bcmp समारोह बाइट स्ट्रिंग s2 के खिलाफ बाइट स्ट्रिंग एस 1 तुलना करती है। दोनों तारों को लंबे समय तक बाइट माना जाता है।

int bcmp(const void *s1, const void *s2, int nbyte);

यह फ़ंक्शन 0 देता है यदि दोनों स्ट्रिंग्स समान हैं, 1 अन्यथा। Bcmp () फ़ंक्शन हमेशा 0 पर वापस आता है जब nbyte 0 होता है।

मापदंडों

  • s1 - यह तुलना करने के लिए पहला स्ट्रिंग निर्दिष्ट करता है।

  • s2 - यह दूसरे स्ट्रिंग की तुलना करने के लिए निर्दिष्ट करता है।

  • nbyte - यह बाइट्स की संख्या को निर्दिष्ट करता है।

bcopy समारोह

Bcopy समारोह प्रतियां nbyte स्ट्रिंग s2 के लिए स्ट्रिंग एस 1 से बाइट्स। ओवरलैपिंग स्ट्रिंग्स को सही ढंग से संभाला जाता है।

void bcopy(const void *s1, void *s2, int nbyte);

यह फ़ंक्शन कुछ भी वापस नहीं करता है।

मापदंडों

  • s1 - यह स्रोत स्ट्रिंग निर्दिष्ट करता है।

  • s2v - यह गंतव्य स्ट्रिंग निर्दिष्ट करता है।

  • nbyte - यह कॉपी किए जाने वाले बाइट्स की संख्या को निर्दिष्ट करता है।

memset समारोह

Memset समारोह भी उसी तरह के रूप में में सेट संरचना चर लिए किया जाता हैbzero। नीचे दिए गए इसके सिंटैक्स पर एक नज़र डालें।

void *memset(void *s, int c, int nbyte);

यह फ़ंक्शन शून्य करने के लिए एक पॉइंटर लौटाता है; वास्तव में, सेट की गई मेमोरी के लिए एक संकेतक और आपको इसे तदनुसार जाति की आवश्यकता है।

मापदंडों

  • s - यह सेट किए जाने वाले स्रोत को निर्दिष्ट करता है।

  • c - यह चरित्र को nbyte स्थानों पर सेट करने के लिए निर्दिष्ट करता है।

  • nbyte - यह सेट किए जाने वाले बाइट्स की संख्या को निर्दिष्ट करता है।

एक प्रक्रिया को एक टीसीपी सर्वर बनाने के लिए, आपको नीचे दिए गए चरणों का पालन करना होगा -

  • सॉकेट () सिस्टम कॉल के साथ एक सॉकेट बनाएं ।

  • बाइंड () सिस्टम कॉल का उपयोग करके सॉकेट को एक पते पर बांधें । इंटरनेट पर एक सर्वर सॉकेट के लिए, एक पता होस्ट मशीन पर एक पोर्ट नंबर होता है।

  • सुनो () सिस्टम कॉल के साथ कनेक्शन के लिए सुनो

  • कनेक्शन () सिस्टम कॉल के साथ एक कनेक्शन स्वीकार करें। यह कॉल आम तौर पर तब तक ब्लॉक होती है जब तक कोई क्लाइंट सर्वर से कनेक्ट नहीं होता है।

  • रीड () और राइट () सिस्टम कॉल का उपयोग करके डेटा भेजें और प्राप्त करें ।

अब हम इन चरणों को सोर्स कोड के रूप में रखते हैं। इस कोड को फ़ाइल server.c में डालें और इसे gcc कंपाइलर के साथ संकलित करें ।

#include <stdio.h>
#include <stdlib.h>

#include <netdb.h>
#include <netinet/in.h>

#include <string.h>

int main( int argc, char *argv[] ) {
   int sockfd, newsockfd, portno, clilen;
   char buffer[256];
   struct sockaddr_in serv_addr, cli_addr;
   int  n;
   
   /* First call to socket() function */
   sockfd = socket(AF_INET, SOCK_STREAM, 0);
   
   if (sockfd < 0) {
      perror("ERROR opening socket");
      exit(1);
   }
   
   /* Initialize socket structure */
   bzero((char *) &serv_addr, sizeof(serv_addr));
   portno = 5001;
   
   serv_addr.sin_family = AF_INET;
   serv_addr.sin_addr.s_addr = INADDR_ANY;
   serv_addr.sin_port = htons(portno);
   
   /* Now bind the host address using bind() call.*/
   if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) {
      perror("ERROR on binding");
      exit(1);
   }
      
   /* Now start listening for the clients, here process will
      * go in sleep mode and will wait for the incoming connection
   */
   
   listen(sockfd,5);
   clilen = sizeof(cli_addr);
   
   /* Accept actual connection from the client */
   newsockfd = accept(sockfd, (struct sockaddr *)&cli_addr, &clilen);
	
   if (newsockfd < 0) {
      perror("ERROR on accept");
      exit(1);
   }
   
   /* If connection is established then start communicating */
   bzero(buffer,256);
   n = read( newsockfd,buffer,255 );
   
   if (n < 0) {
      perror("ERROR reading from socket");
      exit(1);
   }
   
   printf("Here is the message: %s\n",buffer);
   
   /* Write a response to the client */
   n = write(newsockfd,"I got your message",18);
   
   if (n < 0) {
      perror("ERROR writing to socket");
      exit(1);
   }
      
   return 0;
}

एकाधिक कनेक्शन संभालें

सर्वर को एक साथ कई कनेक्शनों को संभालने की अनुमति देने के लिए, हम उपरोक्त कोड में निम्नलिखित बदलाव करते हैं -

  • रखो स्वीकार अनंत लूप में बयान और निम्नलिखित कोड।

  • एक कनेक्शन स्थापित होने के बाद, एक नई प्रक्रिया बनाने के लिए कांटा () को कॉल करें ।

  • चाइल्ड प्रोसेस, सॉक्सड को बंद कर देगा और डोप्रोसेसिंग फ़ंक्शन को कॉल करेगा , नए सॉकेट फ़ाइल डिस्क्रिप्टर को एक तर्क के रूप में पास करेगा । जब दो प्रक्रियाओं ने अपनी बातचीत पूरी कर ली है, जैसा कि डॉप्रोसेसिंग () लौटने से संकेत मिलता है , यह प्रक्रिया बस बाहर निकल जाती है।

  • मूल प्रक्रिया newsockfd को बंद कर देती है । जैसा कि यह सभी कोड एक अनंत लूप में है, यह अगले कनेक्शन की प्रतीक्षा करने के लिए स्वीकार किए गए विवरण पर वापस आ जाएगा।

#include <stdio.h>
#include <stdlib.h>

#include <netdb.h>
#include <netinet/in.h>

#include <string.h>

void doprocessing (int sock);

int main( int argc, char *argv[] ) {
   int sockfd, newsockfd, portno, clilen;
   char buffer[256];
   struct sockaddr_in serv_addr, cli_addr;
   int n, pid;
   
   /* First call to socket() function */
   sockfd = socket(AF_INET, SOCK_STREAM, 0);
   
   if (sockfd < 0) {
      perror("ERROR opening socket");
      exit(1);
   }
   
   /* Initialize socket structure */
   bzero((char *) &serv_addr, sizeof(serv_addr));
   portno = 5001;
   
   serv_addr.sin_family = AF_INET;
   serv_addr.sin_addr.s_addr = INADDR_ANY;
   serv_addr.sin_port = htons(portno);
   
   /* Now bind the host address using bind() call.*/
   if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) {
      perror("ERROR on binding");
      exit(1);
   }
   
   /* Now start listening for the clients, here
      * process will go in sleep mode and will wait
      * for the incoming connection
   */
   
   listen(sockfd,5);
   clilen = sizeof(cli_addr);
   
   while (1) {
      newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);
		
      if (newsockfd < 0) {
         perror("ERROR on accept");
         exit(1);
      }
      
      /* Create child process */
      pid = fork();
		
      if (pid < 0) {
         perror("ERROR on fork");
         exit(1);
      }
      
      if (pid == 0) {
         /* This is the client process */
         close(sockfd);
         doprocessing(newsockfd);
         exit(0);
      }
      else {
         close(newsockfd);
      }
		
   } /* end of while */
}

निम्नलिखित कोड seqment doprocessing फ़ंक्शन का एक सरल कार्यान्वयन दिखाता है।

void doprocessing (int sock) {
   int n;
   char buffer[256];
   bzero(buffer,256);
   n = read(sock,buffer,255);
   
   if (n < 0) {
      perror("ERROR reading from socket");
      exit(1);
   }
   
   printf("Here is the message: %s\n",buffer);
   n = write(sock,"I got your message",18);
   
   if (n < 0) {
      perror("ERROR writing to socket");
      exit(1);
   }
	
}

एक प्रक्रिया को टीसीपी ग्राहक बनाने के लिए, आपको नीचे दिए गए चरणों का पालन करने की आवश्यकता है & minus;

  • सॉकेट () सिस्टम कॉल के साथ एक सॉकेट बनाएं ।

  • कनेक्ट () सिस्टम कॉल का उपयोग करके सर्वर के पते पर सॉकेट कनेक्ट करें।

  • डेटा भेजें और प्राप्त करें। इसे करने के कई तरीके हैं, लेकिन सबसे आसान तरीका है रीड () और राइट () सिस्टम कॉल का उपयोग करना।

अब हम इन चरणों को सोर्स कोड के रूप में रखते हैं। इस कोड को फाइल में डालेंclient.c और इसके साथ संकलित करें gcc संकलक।

सर्वर से कनेक्ट करने के लिए, इस प्रोग्राम को चलाएं और होस्टनाम और सर्वर के पोर्ट नंबर को पास करें, जिसे आपको पहले से ही किसी अन्य यूनिक्स विंडो में चलाना होगा।

#include <stdio.h>
#include <stdlib.h>

#include <netdb.h>
#include <netinet/in.h>

#include <string.h>

int main(int argc, char *argv[]) {
   int sockfd, portno, n;
   struct sockaddr_in serv_addr;
   struct hostent *server;
   
   char buffer[256];
   
   if (argc < 3) {
      fprintf(stderr,"usage %s hostname port\n", argv[0]);
      exit(0);
   }
	
   portno = atoi(argv[2]);
   
   /* Create a socket point */
   sockfd = socket(AF_INET, SOCK_STREAM, 0);
   
   if (sockfd < 0) {
      perror("ERROR opening socket");
      exit(1);
   }
	
   server = gethostbyname(argv[1]);
   
   if (server == NULL) {
      fprintf(stderr,"ERROR, no such host\n");
      exit(0);
   }
   
   bzero((char *) &serv_addr, sizeof(serv_addr));
   serv_addr.sin_family = AF_INET;
   bcopy((char *)server->h_addr, (char *)&serv_addr.sin_addr.s_addr, server->h_length);
   serv_addr.sin_port = htons(portno);
   
   /* Now connect to the server */
   if (connect(sockfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) < 0) {
      perror("ERROR connecting");
      exit(1);
   }
   
   /* Now ask for a message from the user, this message
      * will be read by server
   */
	
   printf("Please enter the message: ");
   bzero(buffer,256);
   fgets(buffer,255,stdin);
   
   /* Send message to the server */
   n = write(sockfd, buffer, strlen(buffer));
   
   if (n < 0) {
      perror("ERROR writing to socket");
      exit(1);
   }
   
   /* Now read server response */
   bzero(buffer,256);
   n = read(sockfd, buffer, 255);
   
   if (n < 0) {
      perror("ERROR reading from socket");
      exit(1);
   }
	
   printf("%s\n",buffer);
   return 0;
}

यहां सॉकेट प्रोग्रामिंग से संबंधित सभी कार्यों की एक सूची दी गई है।

पोर्ट और सेवा कार्य

यूनिक्स / etc / सेवाओं फ़ाइल से सेवा का नाम लाने के लिए निम्नलिखित कार्य प्रदान करता है।

  • struct servent *getservbyname(char *name, char *proto) - यह कॉल एक सेवा का नाम और एक प्रोटोकॉल नाम लेता है और उस सेवा के लिए संबंधित पोर्ट नंबर देता है।

  • struct servent *getservbyport(int port, char *proto) - यह कॉल एक पोर्ट नंबर और एक प्रोटोकॉल नाम लेता है और संबंधित सेवा का नाम देता है।

बाइट ऑर्डरिंग फ़ंक्शंस

  • unsigned short htons (unsigned short hostshort) - यह फ़ंक्शन होस्ट बाइट ऑर्डर से नेटवर्क बाइट ऑर्डर तक 16-बिट (2-बाइट) मात्रा में कनवर्ट करता है।

  • unsigned long htonl (unsigned long hostlong) - यह फ़ंक्शन होस्ट बाइट ऑर्डर से 32-बिट (4-बाइट) मात्रा को नेटवर्क बाइट ऑर्डर में कनवर्ट करता है।

  • unsigned short ntohs (unsigned short netshort) - यह फ़ंक्शन नेटवर्क बाइट ऑर्डर से 16-बिट (2-बाइट) मात्रा को बाइट ऑर्डर में परिवर्तित करता है।

  • unsigned long ntohl (unsigned long netlong) - यह फ़ंक्शन नेटवर्क बाइट ऑर्डर से 32-बिट मात्रा को बाइट ऑर्डर होस्ट करने के लिए कनवर्ट करता है।

आईपी ​​पता कार्य

  • int inet_aton (const char *strptr, struct in_addr *addrptr)- यह फ़ंक्शन कॉल निर्दिष्ट स्ट्रिंग को इंटरनेट मानक डॉट नोटेशन में, नेटवर्क पते पर, और दिए गए संरचना में पते को संग्रहीत करता है। परिवर्तित पता नेटवर्क बाइट ऑर्डर (बाइट्स को दाईं ओर से ऑर्डर किया गया) में होगा। यह 1 लौटाता है अगर स्ट्रिंग वैध है और 0 त्रुटि पर।

  • in_addr_t inet_addr (const char *strptr)- यह फ़ंक्शन कॉल निर्दिष्ट स्ट्रिंग को इंटरनेट मानक डॉट नोटेशन में, एक इंटरनेट पते के रूप में उपयोग के लिए उपयुक्त पूर्णांक मान में कनवर्ट करता है। परिवर्तित पता नेटवर्क बाइट ऑर्डर (बाइट्स को दाईं ओर से ऑर्डर किया गया) में होगा। यह एक 32-बिट बाइनरी नेटवर्क बाइट आदेश IPv4 पता और INADDR_NONE त्रुटि पर दिया।

  • char *inet_ntoa (struct in_addr inaddr) - यह फ़ंक्शन कॉल इंटरनेट मानक डॉट नोटेशन में निर्दिष्ट इंटरनेट होस्ट पते को स्ट्रिंग में कनवर्ट करता है।

सॉकेट कोर कार्य

  • int socket (int family, int type, int protocol) - यह कॉल एक सॉकेट डिस्क्रिप्टर देता है जिसे आप बाद के सिस्टम कॉल में उपयोग कर सकते हैं या यह आपको त्रुटि पर -1 देता है।

  • int connect (int sockfd, struct sockaddr *serv_addr, int addrlen)- कनेक्ट फ़ंक्शन का उपयोग टीसीपी सर्वर के साथ कनेक्शन स्थापित करने के लिए एक टीसीपी क्लाइंट द्वारा किया जाता है। यदि यह सफलतापूर्वक सर्वर से जुड़ जाता है, तो यह कॉल 0 देता है, अन्यथा यह -1 देता है।

  • int bind(int sockfd, struct sockaddr *my_addr,int addrlen)- बाइंड फ़ंक्शन एक सॉकेट में एक स्थानीय प्रोटोकॉल पता प्रदान करता है। यह कॉल 0 पर वापस लौटता है यदि यह सफलतापूर्वक पते से जुड़ता है, अन्यथा यह -1 देता है।

  • int listen(int sockfd, int backlog)- ग्राहक के अनुरोध को सुनने के लिए सुनने का कार्य केवल टीसीपी सर्वर द्वारा कहा जाता है। यह कॉल सफलता पर 0 देता है, अन्यथा यह -1 देता है।

  • int accept (int sockfd, struct sockaddr *cliaddr, socklen_t *addrlen)- क्लाइंट फ़ंक्शन को स्वीकार करने और वास्तविक कनेक्शन स्थापित करने के लिए टीसीपी सर्वर द्वारा स्वीकार फ़ंक्शन को कहा जाता है। यह कॉल सफलता पर एक गैर-नकारात्मक विवरणक देता है, अन्यथा यह -1 देता है।

  • int send(int sockfd, const void *msg, int len, int flags)- सेंड फंक्शन का उपयोग स्ट्रीम सॉकेट या कनेक्टेड डेटाग्राम सॉकेट्स पर डेटा भेजने के लिए किया जाता है। यह कॉल बाहर भेजे गए बाइट्स की संख्या देता है, अन्यथा यह -1 देता है।

  • int recv (int sockfd, void *buf, int len, unsigned int flags)- recv फ़ंक्शन का उपयोग स्ट्रीम सॉकेट या कनेक्टेड डेटाग्राम सॉकेट पर डेटा प्राप्त करने के लिए किया जाता है। यह कॉल बफ़र में पढ़ी गई बाइट्स की संख्या को लौटाता है, अन्यथा यह त्रुटि पर -1 देता है।

  • int sendto (int sockfd, const void *msg, int len, unsigned int flags, const struct sockaddr *to, int tolen)- Sendto फ़ंक्शन का उपयोग UNCONNECTED डेटाग्राम सॉकेट्स पर डेटा भेजने के लिए किया जाता है। यह कॉल भेजे गए बाइट्स की संख्या को लौटाता है, अन्यथा यह त्रुटि पर -1 देता है।

  • int recvfrom (int sockfd, void *buf, int len, unsigned int flags struct sockaddr *from, int *fromlen)- रिकॉफ्रोम फ़ंक्शन का उपयोग UNCONNECTED डेटाग्राम सॉकेट से डेटा प्राप्त करने के लिए किया जाता है। यह कॉल बफ़र में पढ़ी गई बाइट्स की संख्या को लौटाता है, अन्यथा यह त्रुटि पर -1 देता है।

  • int close (int sockfd)- क्लोजर फंक्शन का उपयोग क्लाइंट और सर्वर के बीच संचार को बंद करने के लिए किया जाता है। यह कॉल सफलता पर 0 देता है, अन्यथा यह -1 देता है।

  • int shutdown (int sockfd, int how)- शटडाउन फ़ंक्शन का उपयोग ग्राहक और सर्वर के बीच संचार को शान से बंद करने के लिए किया जाता है। यह फ़ंक्शन क्लोज फंक्शन की तुलना में अधिक नियंत्रण देता है। यह सफलता पर 0 लौटाता है, -1 अन्यथा।

  • int select (int nfds, fd_set *readfds, fd_set *writefds, fd_set *errorfds, struct timeval *timeout) - इस फ़ंक्शन का उपयोग कई सॉकेट्स को पढ़ने या लिखने के लिए किया जाता है।

सॉकेट हेल्पर फ़ंक्शंस

  • int write (int fildes, const void *buf, int nbyte)- लिखने की क्रिया बफर फाइल से nfte बाइट्स को लिखने का प्रयास करती है, जिसे bf द्वारा ओपन फाइल डिस्क्रिप्टर, फिल्ड्स से जुड़ी फाइल से इंगित किया जाता है। सफल समापन पर, लिखने () वास्तव में फ़ाइल के साथ जुड़े फ़ाइल को लिखी गई बाइट्स की संख्या देता है। यह संख्या कभी भी निबटे से अधिक नहीं है। अन्यथा, -1 लौटा दिया जाता है।

  • int read (int fildes, const void *buf, int nbyte)- पठन फ़ंक्शन, बफ़ द्वारा बताए गए बफ़र में खुली फ़ाइल डिस्क्रिप्टर, फ़िल्ड्स से जुड़ी फ़ाइल से nbyte बाइट्स पढ़ने का प्रयास करता है। सफल समापन पर, लिखने () वास्तव में फ़ाइल के साथ जुड़े फ़ाइल को लिखी गई बाइट्स की संख्या देता है। यह संख्या कभी भी निबटे से अधिक नहीं है। अन्यथा, -1 लौटा दिया जाता है।

  • int fork (void)- कांटा फ़ंक्शन एक नई प्रक्रिया बनाता है। नई प्रक्रिया, जिसे चाइल्ड प्रोसेस कहा जाता है, कॉलिंग प्रक्रिया (मूल प्रक्रिया) की एक सटीक प्रतिलिपि होगी।

  • void bzero (void *s, int nbyte)- बेज़ेरो फ़ंक्शन स्ट्रिंग s में nbyte null बाइट्स रखता है। इस फ़ंक्शन का उपयोग सभी सॉकेट संरचनाओं को शून्य मानों के साथ सेट करने के लिए किया जाएगा।

  • int bcmp (const void *s1, const void *s2, int nbyte)- bcmp फ़ंक्शन बाइट स्ट्रिंग s2 के मुकाबले बाइट स्ट्रिंग s1 की तुलना करता है। दोनों तारों को लंबे समय तक बाइट माना जाता है।

  • void bcopy (const void *s1, void *s2, int nbyte)- bcopy function स्ट्रिंग s1 से string s2 तक nbyte बाइट्स को कॉपी करता है। ओवरलैपिंग स्ट्रिंग्स को सही ढंग से संभाला जाता है।

  • void *memset(void *s, int c, int nbyte) - मेमरी फंक्शन का उपयोग स्ट्रक्चर वेरिएबल्स को उसी तरह सेट करने के लिए किया जाता है जैसे कि बेज़ेरो।