কম্পিউটার টিউটোরিয়াল

ফর্ক ব্যবহার করে সি-তে একটি মাল্টি-প্রসেস সকেট সার্ভার তৈরি করুন

ফর্ক ব্যবহার করে সি-তে একটি মাল্টি-প্রসেস সকেট সার্ভার তৈরি করুন

সি-তে ফর্ক সহ একটি মাল্টি-প্রসেসিং সকেট সার্ভার আমাদেরকে একাধিক ক্লায়েন্ট সংযোগের একযোগে পরিচালনার অনুমতি দেয়। ফর্ক সিস্টেম কল ব্যবহার করে, সার্ভার প্রতিটি সংযুক্ত ক্লায়েন্টের জন্য চাইল্ড প্রসেস তৈরি করতে পারে যা স্বাধীন যোগাযোগ চ্যানেল নিশ্চিত করে। এই পদ্ধতি একাধিক ক্লায়েন্টের সাথে একযোগে যোগাযোগ করতে সক্ষম করে।

আসুন C-তে ফর্ক সহ একটি মাল্টি-প্রসেসিং সকেট সার্ভার কীভাবে প্রয়োগ করা যায় সে সম্পর্কে আলোচনা করা যাক। আমরা একটি সার্ভার-সাইড প্রোগ্রাম এবং একটি ক্লায়েন্ট-সাইড প্রোগ্রামের প্রোগ্রামিং উদাহরণ সম্পর্কে ব্যাখ্যা করব যার মাধ্যমে আমরা সি-তে ফর্ক সহ একটি মাল্টি-প্রসেসিং সকেট সার্ভার অর্জন করতে পারি।

ফর্ক সিস্টেম কল কি?

যখন একটি সিস্টেম কল একটি বিদ্যমান প্রক্রিয়ার একটি ক্লোন তৈরি করে, তখন এটিকে "ফর্ক()" সিস্টেম কল বলা হয়। এটি মূলত চলমান প্রোগ্রামটিকে দুটি পৃথক প্রক্রিয়ায় বিভক্ত করে যা পিতামাতা এবং শিশু হিসাবে পরিচিত। সমস্ত পরামিতি শিশু এবং পিতামাতার প্রক্রিয়াগুলির জন্য একই, তাদের আলাদা পিআইডি ছাড়া। এই সিস্টেম কল নিম্নলিখিত রিটার্ন করে:

  1. অভিভাবকের কাছে সন্তানের প্রক্রিয়ার পিআইডি
  2. শিশুর কাছে শূন্য (0)

প্রোগ্রামিং উদাহরণ 1:সার্ভার-সাইড প্রোগ্রাম

#include
#include
# অন্তর্ভুক্ত করুন
# অন্তর্ভুক্ত করুন
#include
#include
# অন্তর্ভুক্ত করুন
#include

# পোর্ট 8888 সংজ্ঞায়িত করুন

int প্রধান ()
{
    int serSoc, cliSoc;
    struct sockaddr_in serverAddr, clientAddr;
    socklen_t addrSize =sizeof (clientAddr);
    char বাফার [1024];
    int clientCount =0;

    // সার্ভার সকেট তৈরি করুন
    serSoc =সকেট(AF_INET, SOCK_STREAM, 0);
    যদি (serSoc <0) {
        perr ("সকেট তৈরিতে ত্রুটি");
        প্রস্থান (1);
   

    printf ("সার্ভার সকেট তৈরি।\n");

    // আসুন সার্ভার ঠিকানা সেট করি
    serverAddr.sin_family =AF_INET;
    serverAddr.sin_port =htons (PORT);
    serverAddr.sin_addr.s_addr =INADDR_ANY;

   
    if (bind(serSoc, (struct sockaddr*) &serverAddr, sizeof (serverAddr)) <0) {
        pererror ("বাঁধাইয়ে ত্রুটি");
        প্রস্থান (1);
   

    // ইনকামিং সংযোগের জন্য শুনতে শুরু করুন
    যদি (শুনুন (serSoc, 5) ==0) {
        printf ("সংযোগের জন্য শোনা...\n");
    } অন্য {
        perr ("শ্রবণে ত্রুটি");
        প্রস্থান (1);
   

    যখন (1) {
        // আসুন ক্লায়েন্ট সংযোগের জন্য গ্রহণ করি
        cliSoc  =স্বীকার করুন (serSoc, (struct sockaddr* )&clientAddr, &addrSize);
        যদি (cliSoc  <0) {
            ত্রুটি ("সংযোগ গ্রহণে ত্রুটি");
            প্রস্থান (1);
       

        // ক্লায়েন্টের সংখ্যা বৃদ্ধি করুন এবং ক্লায়েন্টের তথ্য প্রদর্শন করুন

        ক্লায়েন্ট কাউন্ট ++;
        printf("ক্লায়েন্ট থেকে গৃহীত সংযোগ %d:%s:%d\n", clientCount, inet_ntoa (clientAddr.sin_addr), ntohs (clientAddr.sin_port));
        printf ("মোট ক্লায়েন্ট সংযুক্ত:%d\n", ক্লায়েন্ট কাউন্ট);

       
        pid_t pid =কাঁটা ();

        যদি (পিড ==0) {
            // শিশু প্রক্রিয়া

           
            বন্ধ (serSoc);

            // ক্লায়েন্ট থেকে বার্তা গ্রহণ
            যখন (1) {
                memset (বাফার, 0, sizeof(বাফার));
                যদি (recv (cliSoc , বাফার, সাইজফ (বাফার), 0) <0) {
                    pererror ("ডেটা গ্রহণে ত্রুটি");
                    প্রস্থান (1);
               

                printf ("ক্লায়েন্টের কাছ থেকে প্রাপ্ত ডেটা %d:%s\n", ক্লায়েন্ট কাউন্ট, বাফার);

                // প্রাপ্ত বার্তাটি ক্লায়েন্টের কাছে ফেরত ইকো করুন
                যদি (পাঠান (cliSoc , বাফার, strlen (বাফার), 0)  0) {
            // অভিভাবক প্রক্রিয়া

           
            বন্ধ (cliSoc);
        } অন্য {
            peror ("কাঁটা কাটার ক্ষেত্রে ত্রুটি");
            প্রস্থান (1);
        }
   

    // সার্ভার সকেট বন্ধ করুন
    বন্ধ (serSoc);

    রিটার্ন 0;

Prওগ্রামিং উদাহরণ 2:ক্লায়েন্ট-সাইড প্রোগ্রাম

#include
#include
# অন্তর্ভুক্ত করুন
# অন্তর্ভুক্ত করুন
#include
#include
# অন্তর্ভুক্ত করুন
#include
# পোর্ট 8888 সংজ্ঞায়িত করুন
#SERVER_IP "127.0.0.1"

সংজ্ঞায়িত করুন

int প্রধান ()
{
    int cliSoc;
    struct sockaddr_in serverAddr;
    char বাফার [1024];
    // ক্লায়েন্ট সকেট তৈরি করুন
    cliSoc  =সকেট (AF_INET, SOCK_STREAM, 0);
    যদি (cliSoc  <0) {
        perr ("সকেট তৈরিতে ত্রুটি");
        প্রস্থান (1);
   

    printf("ক্লায়েন্ট %d সকেট তৈরি হয়েছে।\n", getpid ());

    // সার্ভার ঠিকানা পরামিতি সেট করুন
    serverAddr.sin_family =AF_INET;
    serverAddr.sin_port =htons (PORT);
    serverAddr.sin_addr.s_addr =inet_addr (SERVER_IP);
    // সার্ভারের সাথে সংযোগ করুন
    যদি (কানেক্ট করুন (cliSoc , (struct sockaddr*) &serverAddr, sizeof (serverAddr)) <0) {
        ত্রুটি ("সার্ভারের সাথে সংযোগ করতে ত্রুটি");
        প্রস্থান (1);
   

    printf ("সার্ভারের সাথে সংযুক্ত।\n");
    যখন (1) {
        // ব্যবহারকারীর কাছ থেকে ইনপুট পড়ুন
        printf ("ক্লায়েন্ট %d - একটি বার্তা লিখুন:", getpid ());
        fgets (buffer, sizeof(buffer), stdin);

       
        যদি (পাঠান (cliSoc , বাফার, strlen (বাফার), 0) <0) {
            pererror ("ডেটা পাঠানোর ক্ষেত্রে ত্রুটি");
            প্রস্থান (1);

        }
        // সার্ভার থেকে প্রতিক্রিয়া পান
        memset (বাফার, 0, sizeof(বাফার));
        যদি (recv (cliSoc , বাফার, সাইজফ (বাফার), 0) <0) {
            pererror ("ডেটা গ্রহণে ত্রুটি");
            প্রস্থান (1);
        }
        printf ("ক্লায়েন্ট %d - সার্ভার প্রতিক্রিয়া:%s\n", getpid (), বাফার);
   

    // ক্লায়েন্ট সকেট বন্ধ করুন
    বন্ধ (cliSoc);
    রিটার্ন 0;

আউটপুট:

**সার্ভার প্রোগ্রাম সংকলন**
$gcc ser.c -o ser
$ ./ser
সার্ভার সকেট তৈরি করা হয়েছে।
সংযোগের জন্য শোনা হচ্ছে...
সার্ভার সকেট তৈরি করা হয়েছে।
সংযোগের জন্য শোনা হচ্ছে...
ক্লায়েন্ট 1:127.0.0.1:59074 থেকে গৃহীত সংযোগ
সংযুক্ত মোট ক্লায়েন্ট:1
ক্লায়েন্ট 1 থেকে ডেটা গৃহীত হয়েছে:হাই অ্যাডমিন
ক্লায়েন্ট 2 থেকে গৃহীত সংযোগ:127.0.0.1:40192
সংযুক্ত মোট ক্লায়েন্ট:2
ক্লায়েন্ট 2 থেকে ডেটা গৃহীত হয়েছে:সবাইকে হ্যালো
**ক্লায়েন্ট 1 প্রোগ্রাম সংকলন**
$ gcc cel.c -o cel
$./সেল
ক্লায়েন্ট 4007 সকেট তৈরি করা হয়েছে।
সার্ভারের সাথে সংযুক্ত।
ক্লায়েন্ট 4007 - একটি বার্তা লিখুন:হাই অ্যাডমিন

**ক্লায়েন্ট 2 প্রোগ্রাম সংকলন**
$ gcc cel.c -o cel
$./সেল
ক্লায়েন্ট 4024 সকেট তৈরি করা হয়েছে।
সার্ভারের সাথে সংযুক্ত।
ক্লায়েন্ট 4024 - একটি বার্তা লিখুন:হ্যালো সবাই

ব্যাখ্যা:

এই প্রোগ্রামিং উদাহরণে, আমরা সি-তে ফর্ক সহ একটি মাল্টি-প্রসেসিং সকেট সার্ভারের বাস্তবায়ন ব্যাখ্যা করেছি। এখানে সার্ভার-সাইড প্রোগ্রামে, আমরা একটি সার্ভার সকেট তৈরি করি, এটি একটি নির্দিষ্ট ঠিকানা এবং পোর্টের সাথে আবদ্ধ করি এবং ইনকামিং সংযোগের জন্য শুনি। যখন একটি ক্লায়েন্ট সংযোগ করে, তখন "ফর্ক()" ব্যবহার করে একটি শিশু প্রক্রিয়া তৈরি করা হয়। এটি একাধিক ক্লায়েন্টের একযোগে পরিচালনার অনুমতি দেয়। শিশু প্রক্রিয়াটি ক্লায়েন্টের কাছ থেকে বার্তাগুলি গ্রহণ করে এবং ক্লায়েন্টের আইডি সহ ডেটা প্রদর্শন করে। এই মাল্টি-প্রসেসিং সকেট সার্ভার আমাদের "n" সংখ্যক ক্লায়েন্টের সাথে একযোগে যোগাযোগের অনুমতি দেয়।

উপসংহার

আমরা সি-তে ফর্ক সহ একটি মাল্টি-প্রসেসিং সকেট সার্ভারের বাস্তবায়ন সম্পর্কে আলোচনা করেছি। ফর্ক সিস্টেম কল ব্যবহার করে, এটি আমাদের একাধিক ক্লায়েন্ট সংযোগের একযোগে পরিচালনার অনুমতি দেয়। এটি একাধিক ক্লায়েন্টের সাথে একযোগে যোগাযোগ এবং ক্লায়েন্টের অনুরোধের দক্ষ পরিচালনা সক্ষম করে।

লেখক সম্পর্কে

ফর্ক ব্যবহার করে সি-তে একটি মাল্টি-প্রসেস সকেট সার্ভার তৈরি করুন

বামদেব ঘোষ

ওয়্যারলেস নেটওয়ার্কিং ডোমেনে বামদেব ঘোষের হাতে-কলমে অভিজ্ঞতা রয়েছে। তিনি অ্যান্ড্রয়েড, ব্লুটুথ, লিনাক্স কমান্ড এবং পাইথনের জ্ঞানের সাথে ওয়্যারলেস বা ওয়্যার্ড নেটওয়ার্কিং-এ ওয়্যারশার্ক ক্যাপচার বিশ্লেষণে বিশেষজ্ঞ। তার সাইট অনুসরণ করুন:wifisharks.com


  1. ছবিতে অনুভূমিক রেখাগুলি সরানো হচ্ছে (ওপেনসিভি, পাইথন, ম্যাটপ্লটলিব)

  2. HTML DOM ইনপুট অনুসন্ধান স্থানধারক সম্পত্তি

  3. পাইথনে বিভিন্ন চার্ট সহ ডেটা ভিজ্যুয়ালাইজেশন?

  4. CSS-এ গ্রুপিং সিলেক্টর