<पी> C में फोर्क के साथ एक मल्टी-प्रोसेसिंग सॉकेट सर्वर हमें कई क्लाइंट कनेक्शनों के समवर्ती प्रबंधन की अनुमति देता है। फोर्क सिस्टम कॉल का उपयोग करके, सर्वर प्रत्येक कनेक्टेड क्लाइंट के लिए चाइल्ड प्रोसेस बना सकता है जो स्वतंत्र संचार चैनल सुनिश्चित करता है। यह दृष्टिकोण कई ग्राहकों के साथ एक साथ संचार सक्षम बनाता है। <पी> आइए इस बारे में चर्चा करें कि सी में फोर्क के साथ मल्टी-प्रोसेसिंग सॉकेट सर्वर को कैसे कार्यान्वित किया जाए। हम सर्वर-साइड प्रोग्राम और क्लाइंट-साइड प्रोग्राम के प्रोग्रामिंग उदाहरणों के बारे में बताएंगे, जिसके द्वारा हम सी में फोर्क के साथ मल्टी-प्रोसेसिंग सॉकेट सर्वर प्राप्त कर सकते हैं। फोर्क सिस्टम कॉल क्या है?
<पी> जब कोई सिस्टम कॉल किसी मौजूदा प्रक्रिया का क्लोन बनाता है, तो इसे "फोर्क ()" सिस्टम कॉल कहा जाता है। यह अनिवार्य रूप से चल रहे प्रोग्राम को दो अलग-अलग प्रक्रियाओं में विभाजित करता है जिन्हें पैरेंट और चाइल्ड के रूप में जाना जाता है। चाइल्ड और पैरेंट प्रक्रियाओं के लिए सभी पैरामीटर समान हैं, सिवाय इसके कि उनके पास अलग-अलग पीआईडी हैं। यह सिस्टम कॉल निम्नलिखित लौटाता है:- बच्चे की पीआईडी माता-पिता को भेजी जाती है
- बच्चे को शून्य (0)
प्रोग्रामिंग उदाहरण 1:सर्वर-साइड प्रोग्राम
<पी> #शामिल#शामिल
#शामिल
#शामिल करें
#शामिल
#शामिल
#शामिल
#शामिल
{
int serSoc, cliSoc;
struct sockaddr_in सर्वरएड्र, क्लाइंटएड्र;
socklen_t addrSize =sizeof (clientAddr);
चार बफ़र [1024];
int clientCount =0; <पी> // सर्वर सॉकेट बनाएं
serSoc =सॉकेट(AF_INET, SOCK_STREAM, 0);
यदि (serSoc <0) {
पेरर ("सॉकेट निर्माण में त्रुटि");
बाहर निकलें (1);
} <पी> printf ("सर्वर सॉकेट बनाया गया.\n"); <पी> // आइए सर्वर एड्रेस सेट करें
सर्वरAddr.sin_family =AF_INET;
सर्वरAddr.sin_port =htons (पोर्ट);
सर्वरAddr.sin_addr.s_addr =INADDR_ANY; <पी>
यदि (बाइंड (सेरसोक, (स्ट्रक्चर सॉकएड्र*) और सर्वरएड्र, साइजऑफ़ (सर्वरएड्र)) <0) {
पेरर ("बाइंडिंग में त्रुटि");
बाहर निकलें (1);
} <पी> // आने वाले कनेक्शनों को सुनना प्रारंभ करें
अगर (सुनो (serSoc, 5) ==0) {
printf ("कनेक्शन के लिए सुन रहा हूँ...\n");
}अन्यथा{
पेरोर ("सुनने में त्रुटि");
बाहर निकलें (1);
} <पी> जबकि (1) {
//आइए क्लाइंट कनेक्शन के लिए स्वीकार करें
cliSoc =स्वीकार करें (serSoc, (struct sockaddr* )&clientAddr, &addrSize);
यदि (cliSoc <0) {
पेरर ("कनेक्शन स्वीकार करने में त्रुटि");
बाहर निकलें (1);
} <पी> // ग्राहकों की संख्या बढ़ाएं और ग्राहक जानकारी प्रदर्शित करें <पी> क्लाइंटकाउंट++;
प्रिंटफ ("क्लाइंट %d से स्वीकृत कनेक्शन:%s:%d\n", clientCount, inet_ntoa (clientAddr.sin_addr), ntohs (clientAddr.sin_port));
प्रिंटफ़ ("कुल जुड़े हुए ग्राहक:%d\n", clientCount); <पी>
pid_t pid =कांटा (); <पी> अगर (पीआईडी ==0) {
// चाइल्ड प्रोसेस <पी>
बंद करें (serSoc); <पी> // क्लाइंट से संदेश प्राप्त करें
जबकि (1) {
मेमसेट (बफ़र, 0, साइज़ऑफ़ (बफ़र));
अगर (recv (cliSoc, बफर, साइजऑफ (बफर), 0) <0) {
पेरर ("डेटा प्राप्त करने में त्रुटि");
बाहर निकलें(1);
} <पी> printf ("क्लाइंट %d:%s\n", clientCount, बफर से प्राप्त डेटा); <पी> // प्राप्त संदेश को क्लाइंट को वापस इको करें
यदि (भेजें (cliSoc , बफ़र, स्ट्रलेन (बफ़र), 0) 0) {
// मूल प्रक्रिया <पी>
बंद करें(cliSoc);
}अन्यथा{
पेरर ("फोर्किंग में त्रुटि");
बाहर निकलें (1);
}
} <पी> // सर्वर सॉकेट बंद करें
बंद करें (serSoc); <पी> वापसी 0;
}
प्रोओग्रामिंग उदाहरण 2:क्लाइंट-साइड प्रोग्राम
<पी> #शामिल#शामिल
#शामिल
#शामिल करें
#शामिल
#शामिल
#शामिल
#शामिल
#पोर्ट 8888 को परिभाषित करें
#SERVER_IP "127.0.0.1" को परिभाषित करें <पी> पूर्णांक मुख्य ()
{
int cliSoc;
struct sockaddr_in सर्वरएड्र;
चार बफ़र [1024];
// क्लाइंट सॉकेट बनाएं
cliSoc =सॉकेट (AF_INET, SOCK_STREAM, 0);
यदि (cliSoc <0) {
पेरर ("सॉकेट निर्माण में त्रुटि");
बाहर निकलें (1);
} <पी> प्रिंटफ ("क्लाइंट %d सॉकेट बनाया गया।\n", getpid ()); <पी> // सर्वर एड्रेस पैरामीटर सेट करें
सर्वरAddr.sin_family =AF_INET;
सर्वरAddr.sin_port =htons (पोर्ट);
सर्वरएड्र.sin_addr.s_addr =inet_addr (SERVER_IP);
// सर्वर से कनेक्ट करें
यदि (कनेक्ट करें (cliSoc, (struct sockaddr*) और सर्वरएड्र, साइज़ऑफ़ (सर्वरएड्र)) <0) {
पेरर ("सर्वर से कनेक्ट करने में त्रुटि");
बाहर निकलें (1);
} <पी> प्रिंटफ ("सर्वर से कनेक्टेड.\n");
जबकि (1) {
// उपयोगकर्ता से इनपुट पढ़ें
प्रिंटफ ("क्लाइंट %d - एक संदेश दर्ज करें:", getpid ());
fgets (बफर, sizeof(बफर), stdin); <पी>
अगर (भेजें (cliSoc, बफर, स्ट्रलेन (बफर), 0) <0) {
पेरर ("डेटा भेजने में त्रुटि");
बाहर निकलें (1); <पी> }
// सर्वर से प्रतिक्रिया प्राप्त करें
मेमसेट (बफ़र, 0, साइज़ऑफ़ (बफ़र));
अगर (recv (cliSoc, बफर, साइजऑफ (बफर), 0) <0) {
पेरर ("डेटा प्राप्त करने में त्रुटि");
बाहर निकलें (1);
}
प्रिंटफ ("क्लाइंट %d - सर्वर प्रतिक्रिया:%s\n", getpid (), बफर);
} <पी> // क्लाइंट सॉकेट बंद करें
बंद करें (cliSoc);
वापसी 0;
} <पी> आउटपुट: पी> <पी> **सर्वर प्रोग्राम संकलन**
$ gcc ser.c -o ser
$ ./सेर
सर्वर सॉकेट बनाया गया.
कनेक्शन के लिए सुन रहे हैं...
सर्वर सॉकेट बनाया गया.
कनेक्शन के लिए सुन रहे हैं...
क्लाइंट 1 से स्वीकृत कनेक्शन:127.0.0.1:59074
जुड़े हुए कुल ग्राहक:1
क्लाइंट 1 से डेटा प्राप्त हुआ:hii एडमिन
क्लाइंट 2 से स्वीकृत कनेक्शन:127.0.0.1:40192
जुड़े हुए कुल ग्राहक:2
क्लाइंट 2 से डेटा प्राप्त हुआ:सभी को नमस्कार
**क्लाइंट 1 प्रोग्राम संकलन**
$ जीसीसी सीएल.सी -ओ सीएल
$ ./सेल
क्लाइंट 4007 सॉकेट बनाया गया।
सर्वर से कनेक्ट किया गया.
क्लाइंट 4007 - एक संदेश दर्ज करें:हाय एडमिनपी> <पी> **क्लाइंट 2 प्रोग्राम संकलन**
$ जीसीसी सीएल.सी -ओ सीएल
$ ./सेल
क्लाइंट 4024 सॉकेट बनाया गया।
सर्वर से कनेक्ट किया गया.
क्लाइंट 4024 - एक संदेश दर्ज करें:सभी को नमस्कार <पी> स्पष्टीकरण: पी> <पी> इस प्रोग्रामिंग उदाहरण में, हमने सी में फोर्क के साथ एक मल्टी-प्रोसेसिंग सॉकेट सर्वर के कार्यान्वयन को समझाया। यहां सर्वर-साइड प्रोग्राम में, हम एक सर्वर सॉकेट बनाते हैं, इसे एक विशिष्ट पते और पोर्ट से बांधते हैं, और आने वाले कनेक्शनों को सुनते हैं। जब कोई क्लाइंट कनेक्ट होता है, तो "फोर्क()" का उपयोग करके एक चाइल्ड प्रोसेस बनाई जाती है। यह कई ग्राहकों को एक साथ संभालने की अनुमति देता है। चाइल्ड प्रक्रिया क्लाइंट से संदेश प्राप्त करती है और क्लाइंट की आईडी के साथ डेटा प्रदर्शित करती है। यह मल्टी-प्रोसेसिंग सॉकेट सर्वर हमें "n" संख्या में ग्राहकों के साथ एक साथ संचार करने की अनुमति देता है।
निष्कर्ष
<पी> हमने सी में फोर्क के साथ मल्टी-प्रोसेसिंग सॉकेट सर्वर के कार्यान्वयन के बारे में चर्चा की। फोर्क सिस्टम कॉल का उपयोग करके, यह हमें कई क्लाइंट कनेक्शनों के समवर्ती प्रबंधन की अनुमति देता है। यह कई ग्राहकों के साथ एक साथ संचार और ग्राहक अनुरोधों के कुशल प्रबंधन को सक्षम बनाता है।लेखक के बारे में
<पी>