C++ में सॉकेट प्रोग्रामिंग

C Mem Soketa Programinga



कंप्यूटर नेटवर्किंग के क्षेत्र में सॉकेट प्रोग्रामिंग एक महत्वपूर्ण विषय बन गया है। इसमें बिना किसी रुकावट के एक दूसरे के साथ संचार करने के लिए दो नोड्स, सर्वर और क्लाइंट के बीच संबंध स्थापित करना शामिल है। सर्वर संचार चैनल में श्रोता के रूप में कार्य करता है और आईपी पते पर एक विशिष्ट पोर्ट पर क्लाइंट को सुनता है। दूसरी ओर, ग्राहक संचार चैनल में संचारक के रूप में कार्य करता है। कनेक्शन बनाने और सर्वर से संपर्क बनाने के लिए क्लाइंट सर्वर से संपर्क करता है। इस लेख का उद्देश्य C++ में सॉकेट प्रोग्रामिंग के लिए एक व्यापक और विस्तृत मार्गदर्शिका प्रदान करना, मूल बातें शामिल करना, व्यावहारिक उदाहरण प्रस्तुत करना और कोड का विस्तृत विवरण प्रदान करना है।

क्लाइंट-सर्वर मॉडल की स्थापना

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

1. सर्वर साइड







मॉडल के सर्वर साइड का कोड निम्नलिखित में दिया गया है। आइए देखें कि कोड में क्या हो रहा है:



#शामिल करें
#शामिल करें
#शामिल
#शामिल

का उपयोग करते हुए नाम स्थान कक्षा ;

#पोर्ट 8080 को परिभाषित करें
#MAX_BUF_SIZE 1024 को परिभाषित करें

int यहाँ मुख्य ( ) {
int यहाँ ser_socket, cli_socket ;
struct sockaddr_in ser_address, cli_address ;
चार buf [ MAX_BUF_SIZE ] = { 0 } ;

अगर ( ( ser_socket = सॉकेट ( AF_INET, SOCK_STREAM, 0 ) ) == - 1 ) {
आतंक ( 'सॉकेट निर्माण में त्रुटि' ) ;
बाहर निकलना ( EXIT_FAILURE ) ;
}

ser_पता. पाप_परिवार = OF_INET ;
ser_पता. पाप_पता . s_addr = INADDR_कोई भी ;
ser_पता. पाप_पोर्ट = htons ( पत्तन ) ;

अगर ( बाँध ( be_socket, ( struct sockaddr * ) & ser_पता, का आकार ( ser_पता ) ) == - 1 ) {
आतंक ( 'बंधन में विफलता' ) ;
बाहर निकलना ( EXIT_FAILURE ) ;
}

अगर ( सुनना ( be_socket, 3 ) == - 1 ) {
आतंक ( 'सुनने में असफल' ) ;
बाहर निकलना ( EXIT_FAILURE ) ;
}

अदालत << 'सर्वर पोर्ट पर सुन रहा है' << पत्तन << '... \एन ' ;

socklen_t cli_address_len = का आकार ( cli_पता ) ;
अगर ( ( cli_socket = स्वीकार करना ( be_socket, ( struct sockaddr * ) & cli_पता, & cli_address_len ) ) == - 1 ) {
आतंक ( 'स्वीकार करने में विफल' ) ;
बाहर निकलना ( EXIT_FAILURE ) ;
}

पढ़ना ( cli_socket, buf, MAX_BUF_SIZE ) ;
अदालत << 'ग्राहक का संदेश है:' << buf << अंतः ;

भेजना ( cli_सॉकेट, 'सर्वर का संदेश' , strlen ( 'सर्वर का संदेश' ) , 0 ) ;

बंद करना ( cli_socket ) ;
बंद करना ( ser_socket ) ;

वापस करना 0 ;
}

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



कार्यक्रम पुस्तकालयों को शामिल करने के साथ शुरू होता है: मानक इनपुट/आउटपुट परिभाषाओं के लिए 'iostream', स्ट्रिंग हैंडलिंग फ़ंक्शंस के लिए 'cstring', POSIX ऑपरेटिंग सिस्टम API तक पहुंच प्रदान करने के लिए 'unistd.h', और 'arpa/inet.h' इंटरनेट संचालन करें. '#define PORT 8080' कथन का अर्थ है कि यह पोर्ट संख्या 8080 को परिभाषित करता है जिस पर सर्वर सुनेगा। '#define MAX_BUF_SIZE 1024' का अर्थ आने वाले डेटा के लिए अधिकतम बफर आकार है जो 1024 है।





मुख्य फ़ंक्शन में, सर्वर और क्लाइंट दोनों का प्रतिनिधित्व करने के लिए क्रमशः दो वेरिएबल्स, 'ser_socket' और 'cli_socket' प्रारंभ किए जाते हैं। अन्य तीन वेरिएबल जो 'sockaddr_in', 'ser_address' और 'struct' प्रकार के 'cli_address' हैं, सर्वर और क्लाइंट के लिए एड्रेस स्ट्रक्चर के रूप में आरंभ किए गए हैं। उसके बाद, 'बफ़' नाम का एक बफ़र प्रारंभ किया जाता है जो क्लाइंट से आने वाले डेटा को संग्रहीत करता है।

'if' स्थिति में सॉकेट() फ़ंक्शन एक नया TCP सॉकेट बनाता है। AF_INET IPv4 को दर्शाता है, SOCK_STREAM कनेक्शन-उन्मुख और विश्वसनीय TCP सॉकेट को दर्शाता है, अंतिम तर्क जो 0 है वह डिफ़ॉल्ट TCP प्रोटोकॉल का चयन करने के लिए दिया गया है, INADDR_ANY किसी भी IP पते पर कनेक्शन स्वीकार करता है, और htons (PORT) पोर्ट नंबर को परिवर्तित करता है नेटवर्क बाइट ऑर्डर के लिए होस्ट बाइट ऑर्डर।



चूँकि सब कुछ ठीक से परिभाषित है, अगला कदम सर्वर को दिए गए पोर्ट पर एक लिस्टर के रूप में स्थापित करना और किसी भी नेटवर्क इंटरफ़ेस पर कनेक्शन स्वीकार करना है। सॉकेट को बाइंड() विधि द्वारा 'ser_address' में जानकारी के साथ दिया गया है। यदि बाइंडिंग विफल हो जाती है तो हम एक त्रुटि प्रिंट करते हैं और प्रक्रिया समाप्त कर देते हैं। एक्सेप्ट() फ़ंक्शन क्लाइंट के साथ कनेक्शन के लिए एक नया सॉकेट खोलता है, जबकि लिसन() फ़ंक्शन सर्वर को आने वाले कनेक्शन के लिए प्रतीक्षा करने का निर्देश देता है। यदि स्वीकार() फ़ंक्शन विफल हो जाता है, तो त्रुटि संदेश मुद्रित होता है और फ़ंक्शन बाहर निकल जाएगा।

इसके बाद, सर्वर क्लाइंट संदेश को रीड() फ़ंक्शन के साथ 'बफ़' बफर में पढ़ता है और फिर इसे कंसोल पर प्रिंट करता है। क्लाइंट को प्रतिक्रिया में संदेश भेजने के लिए सर्वर द्वारा सेंड() फ़ंक्शन का उपयोग किया जाता है। अंत में, क्लोज़() का उपयोग करके, सर्वर क्लाइंट के सॉकेट को बंद कर देता है, प्रोग्राम को समाप्त कर देता है ताकि सभी कनेक्शन ठीक से बंद हो जाएं और डेटा उल्लंघन की कोई संभावना न हो।

2. ग्राहक पक्ष

अब, आइए देखें कि क्लाइंट मॉडल में क्या होता है:

#शामिल करें
#शामिल करें
#शामिल
#शामिल

#पोर्ट 8080 को परिभाषित करें
#SERVER_IP को परिभाषित करें '127.0.0.1'

int यहाँ मुख्य ( ) {
int यहाँ cli_socket ;
struct sockaddr_in ser_address ;
कॉन्स्ट चार * mesg = 'ग्राहक शुभकामनाएँ भेज रहा है!' ;

अगर ( ( cli_socket = सॉकेट ( AF_INET, SOCK_STREAM, 0 ) ) == - 1 ) {
आतंक ( 'सॉकेट निर्माण में त्रुटि' ) ;
बाहर निकलना ( EXIT_FAILURE ) ;
}

ser_पता. पाप_परिवार = OF_INET ;
ser_पता. पाप_पोर्ट = htons ( पत्तन ) ;

अगर ( inet_pton ( AF_INET, सर्वर_आईपी, & ser_पता. पाप_पता ) <= 0 ) {
आतंक ( 'गलत पता' ) ;
बाहर निकलना ( EXIT_FAILURE ) ;
}

अगर ( जोड़ना ( cli_सॉकेट, ( struct sockaddr * ) & ser_पता, का आकार ( ser_पता ) ) == - 1 ) {
आतंक ( 'कनेक्शन विफलता' ) ;
बाहर निकलना ( EXIT_FAILURE ) ;
}
भेजना ( cli_socket, संदेश, strlen ( mesg ) , 0 ) ;

चार buf [ 1024 ] = { 0 } ;
पढ़ना ( cli_socket, buf, का आकार ( buf ) ) ;
कक्षा :: अदालत << 'सर्वर प्रतिक्रिया:' << buf << कक्षा :: अंतः ;

बंद करना ( cli_socket ) ;
वापस करना 0 ;
}

प्रोग्राम कैसे काम करता है यह समझने के लिए आइए कोड की प्रत्येक पंक्ति देखें।

वही चार लाइब्रेरी - iostream, cstring, unistd.h, और arpa/inet.h - भी क्लाइंट साइड में शामिल हैं। स्थानीय होस्ट 127.0.0.1 के आईपी पते के साथ एक पोर्ट नंबर भी परिभाषित किया गया है। जो संदेश सर्वर तक पहुंचाना है वह दिया गया है। क्लाइंट और सर्वर को निम्नलिखित चरण के अनुसार कनेक्शन स्थापित करने की आवश्यकता है:

'अगर ((क्लाइंट_सॉकेट = सॉकेट(AF_INET, SOCK_STREAM, 0)) == -1);' स्ट्रीम प्रकार और डिफ़ॉल्ट प्रोटोकॉल टीसीपी के साथ IPv4 के लिए एक सॉकेट बनाता है। यदि सॉकेट() फ़ंक्शन कनेक्शन स्थापित करने में विफल रहता है और प्रोग्राम से बाहर निकल जाता है, तो पेरर() त्रुटि विवरण प्रिंट करता है।

“server_address.sin_port = htons(PORT);” नेटवर्क बाइट क्रम में कनवर्ट करने के बाद पोर्ट नंबर सेट करता है। बाद में, एक और विफलता संदेश जो कि 'गलत पता' है, यहां दिया गया है जो पते में कुछ गड़बड़ होने पर मुद्रित होता है। 'ser_address' में पता ढूंढकर, क्लाइंट सर्वर से कनेक्ट हो जाएगा। यदि कनेक्शन विफल हो जाता है, तो त्रुटि विवरण मुद्रित होते हैं। सेंड() फ़ंक्शन संदेश को सर्वर पर स्थानांतरित कर देगा, यह सुनिश्चित करते हुए कि इसमें कोई ध्वज नहीं है।

सर्वर से प्रतिक्रिया प्राप्त करने और संग्रहीत करने के लिए, 'char' प्रकार का 'buf' नामक एक बफर आरंभ किया जाता है। रीड() फ़ंक्शन सर्वर की प्रतिक्रिया को बफर में पढ़ता है। अंत में, सर्वर की प्रतिक्रिया कंसोल पर मुद्रित होती है। अंत में, सॉकेट को समाप्त करने के लिए क्लोज़() स्टेटमेंट का उपयोग करके कनेक्शन बंद कर दिया जाता है। प्रोग्राम का आउटपुट निम्नलिखित है:

निष्कर्ष

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