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

সি-তে Fork ব্যবহার করে মাল্টি-প্রসেস সকেট সার্ভার তৈরি

সি-তে Fork ব্যবহার করে মাল্টি-প্রসেস সকেট সার্ভার তৈরি

সি-তে fork দিয়ে একটি মাল্টি-প্রসেসিং সকেট সার্ভার একাধিক ক্লায়েন্ট কানেকশন সমকಾಲীনভাবে হ্যান্ডেল করতে সক্ষম করে। fork সিস্টেম কল ব্যবহার করে, সার্ভার প্রতিটি সংযুক্ত ক্লায়েন্টের জন্য চাইল্ড প্রসেস তৈরি করতে পারে যা স্বাধীন কমিউনিকেশন চ্যানেল নিশ্চিত করে। এই পদ্ধতি একাধিক ক্লায়েন্টের সাথে সমকালীন কমিউনিকেশন সক্ষম করে।

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

Fork সিস্টেম কল কী?

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

  1. প্যারেন্ট প্রসেসে চাইল্ড প্রসেসের PID
  2. চাইল্ড প্রসেসে শূন্য (0)

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

#include <arpa/inet.h>
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <unistd.h>

#define PORT 8888

int main ()
{
 int serSoc, cliSoc ;
 struct sockaddr_in serverAddr, clientAddr;
 socklen_t addrSize = sizeof (clientAddr);
 char buffer [1024];
 int clientCount = 0;

 // Create server socket
 serSoc = socket(AF_INET, SOCK_STREAM, 0);
 if (serSoc < 0) {
 perror ("Error in socket creation");
 exit (1);
 }

 printf ("Server socket created.\n");

 // Set server address
 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) {
 perror ("Error in binding");
 exit (1);
 }

 // Start listening for incoming connections
 if (listen (serSoc, 5) == 0) {
 printf ("Listening for connections...\n");
 } else {
 perror ("Error in listening");
 exit (1);
 }

 while (1) {
 // Accept a client connection
 cliSoc = accept (serSoc, (struct sockaddr* )& clientAddr, &addrSize);
 if (cliSoc < 0) {
 perror("Error in accepting connection");
 exit (1);
 }

 // Increment client count and display client information
 clientCount++;
 printf("Accepted connection from Client %d: %s:%d\n", clientCount, inet_ntoa (clientAddr.sin_addr), ntohs (clientAddr.sin_port));
 printf ("Total clients connected: %d\n", clientCount);

 pid_t pid = fork ();

 if (pid == 0) {
 // Child process

 close (serSoc);

 // Receive messages from the client
 while (1) {
 memset (buffer, 0, sizeof(buffer));
 if (recv (cliSoc , buffer, sizeof (buffer), 0) < 0) {
 perror ("Error in receiving data");
 exit(1);
 }

 printf ("Received data from Client %d: %s\n", clientCount, buffer);

 // Echo the received message back to the client
 if (send (cliSoc , buffer, strlen (buffer), 0) 0) {
 // Parent process

 close(cliSoc );
 } else {
 perror ("Error in forking");
 exit (1);
 }
 }

// Close the server socket
 close (serSoc);

 return 0;
 }

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

#include <arpa/inet.h>
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <unistd.h>
#define PORT 8888
#define SERVER_IP "127.0.0.1"

int main ()
{
 int cliSoc ;
 struct sockaddr_in serverAddr;
 char buffer [1024];
 // Create client socket
 cliSoc = socket (AF_INET, SOCK_STREAM, 0);
 if (cliSoc < 0) {
 perror ("Error in socket creation");
 exit (1);
 }

 printf("Client %d socket created.\n", getpid ());

 // Set server address parameters
 serverAddr.sin_family = AF_INET;
 serverAddr.sin_port = htons (PORT);
 serverAddr.sin_addr.s_addr = inet_addr (SERVER_IP);
 // Connect to the server
 if (connect (cliSoc , (struct sockaddr*) & serverAddr, sizeof (serverAddr)) < 0) {
 perror("Error in connecting to server");
 exit (1);
 }

 printf ("Connected to server.\n");
 while (1) {
 // Read input from user
 printf ("Client %d - Enter a message: ", getpid ());
 fgets (buffer, sizeof(buffer), stdin);

 if (send (cliSoc , buffer, strlen (buffer), 0) < 0) {
 perror ("Error in sending data");
 exit (1);

 }
 // Receive response from the server
 memset (buffer, 0, sizeof(buffer));
 if (recv (cliSoc , buffer, sizeof (buffer), 0) < 0) {
 perror ("Error in receiving data");
 exit (1);
 }
 printf ("Client %d - Server response: %s\n", getpid (), buffer);
 }

// Close the client socket
 close (cliSoc );
 return 0;
 }

আউটপুট:

**Server program compilation**
$ gcc ser.c -o ser
$ ./ser
Server socket created.
Listening for connections...
Server socket created.
Listening for connections...
Accepted connection from Client 1: 127.0.0.1:59074
Total clients connected: 1
Received data from Client 1: hii admin
Accepted connection from Client 2: 127.0.0.1:40192
Total clients connected: 2
Received data from Client 2: hello everybody
**Client 1 program compilation**
$ gcc cel.c -o cel
$ ./cel
Client 4007 socket created.
Connected to server.
Client 4007 - Enter a message: hii admin

**Client 2 program compilation**
$ gcc cel.c -o cel
$ ./cel
Client 4024 socket created.
Connected to server.
Client 4024 - Enter a message: hello everybody

ব্যাখ্যা:

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

উপসংহার

আমরা সি-তে fork দিয়ে একটি মাল্টি-প্রসেসিং সকেট সার্ভার বাস্তবায়ন নিয়ে আলোচনা করেছি। fork সিস্টেম কল ব্যবহার করে, এটি একাধিক ক্লায়েন্ট কানেকশন সমকালীনভাবে হ্যান্ডেল করতে সক্ষম করে। এটি একাধিক ক্লায়েন্টের সাথে সমকালীন কমিউনিকেশন এবং ক্লায়েন্ট রিকোয়েস্ট দক্ষতার সাথে হ্যান্ডেল করতে সক্ষম করে।

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

সি-তে Fork ব্যবহার করে মাল্টি-প্রসেস সকেট সার্ভার তৈরি

বামদেব ঘোষ

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

  1. জাভাস্ক্রিপ্টে Array.prototype.includes() মেথড

  2. জাভাস্ক্রিপ্টে দুটি অবজেক্ট তুলনা করে নেস্টেড ভ্যালু গ্রুপিং করা

  3. Android ImageView-এ Zoom In/Out ইমপ্লিমেন্টেশন

  4. CSS3 ট্রানজিশন ইফেক্ট (Transition Effects) তৈরি