Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> सी प्रोग्रामिंग

फोर्क का उपयोग करके सी में एक मल्टी-प्रोसेस सॉकेट सर्वर बनाएं

<पी> फोर्क का उपयोग करके सी में एक मल्टी-प्रोसेस सॉकेट सर्वर बनाएं

<पी> C में फोर्क के साथ एक मल्टी-प्रोसेसिंग सॉकेट सर्वर हमें कई क्लाइंट कनेक्शनों के समवर्ती प्रबंधन की अनुमति देता है। फोर्क सिस्टम कॉल का उपयोग करके, सर्वर प्रत्येक कनेक्टेड क्लाइंट के लिए चाइल्ड प्रोसेस बना सकता है जो स्वतंत्र संचार चैनल सुनिश्चित करता है। यह दृष्टिकोण कई ग्राहकों के साथ एक साथ संचार सक्षम बनाता है।

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

फोर्क सिस्टम कॉल क्या है?

<पी> जब कोई सिस्टम कॉल किसी मौजूदा प्रक्रिया का क्लोन बनाता है, तो इसे "फोर्क ()" सिस्टम कॉल कहा जाता है। यह अनिवार्य रूप से चल रहे प्रोग्राम को दो अलग-अलग प्रक्रियाओं में विभाजित करता है जिन्हें पैरेंट और चाइल्ड के रूप में जाना जाता है। चाइल्ड और पैरेंट प्रक्रियाओं के लिए सभी पैरामीटर समान हैं, सिवाय इसके कि उनके पास अलग-अलग पीआईडी ​​हैं। यह सिस्टम कॉल निम्नलिखित लौटाता है:

  1. बच्चे की पीआईडी माता-पिता को भेजी जाती है
  2. बच्चे को शून्य (0)

प्रोग्रामिंग उदाहरण 1:सर्वर-साइड प्रोग्राम

<पी> #शामिल
#शामिल
#शामिल
#शामिल करें
#शामिल
#शामिल
#शामिल
#शामिल

<पी> #पोर्ट 8888

को परिभाषित करें <पी> पूर्णांक मुख्य ()
{
    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" संख्या में ग्राहकों के साथ एक साथ संचार करने की अनुमति देता है।

निष्कर्ष

<पी> हमने सी में फोर्क के साथ मल्टी-प्रोसेसिंग सॉकेट सर्वर के कार्यान्वयन के बारे में चर्चा की। फोर्क सिस्टम कॉल का उपयोग करके, यह हमें कई क्लाइंट कनेक्शनों के समवर्ती प्रबंधन की अनुमति देता है। यह कई ग्राहकों के साथ एक साथ संचार और ग्राहक अनुरोधों के कुशल प्रबंधन को सक्षम बनाता है।

लेखक के बारे में

<पी> फोर्क का उपयोग करके सी में एक मल्टी-प्रोसेस सॉकेट सर्वर बनाएं

बामदेब घोष

<पी> बामदेब घोष को वायरलेस नेटवर्किंग डोमेन में व्यावहारिक अनुभव है। वह एंड्रॉइड, ब्लूटूथ, लिनक्स कमांड और पायथन के ज्ञान के साथ-साथ वायरलेस या वायर्ड नेटवर्किंग पर वायरशार्क कैप्चर विश्लेषण में विशेषज्ञ हैं। उसकी साइट का अनुसरण करें:wifisharks.com


  1. टिंकर का उपयोग करके एक पायथन 3 ऐप को .exe में कैसे संकलित करें? टिंकर का उपयोग करके एक पायथन 3 ऐप को .exe में कैसे संकलित करें?

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

  1. एचटीएमएल डोम इनपुट रंग अक्षम संपत्ति एचटीएमएल डोम इनपुट रंग अक्षम संपत्ति

    HTML DOM इनपुट कलर डिसेबल्ड प्रॉपर्टी सेट/रिटर्न करती है कि इनपुट कलर सक्षम है या अक्षम है। सिंटैक्स निम्नलिखित वाक्य रचना है - बूलियन मान लौटाना - सही/गलत inputColorObject.disabled सेटिंग अक्षम बूलियन वैल्यू के लिए inputColorObject.disabled = booleanValue बूलियन मान यहां, “बूलियनवैल्यू” निम्

  1. my.cnf में इष्टतम MySQL कॉन्फ़िगरेशन सेट करें? my.cnf में इष्टतम MySQL कॉन्फ़िगरेशन सेट करें?

    सबसे पहले, आपको my.cnf फ़ाइल खोलनी होगी। विंडोज़ पर कॉन्फ़िगरेशन फ़ाइल की निर्देशिका स्थान प्राप्त करने के लिए निम्नलिखित क्वेरी है - @@datadir चुनें; आउटपुट +--------------------------------------------------------+ | @@दातादिर |+-------------------------------------------------------- +| सी:\Prog