এখানে আমরা একটি সিস্টেম তৈরি করব যেখানে একটি ক্লায়েন্ট এবং একটি সার্ভার থাকবে। ক্লায়েন্ট সার্ভারে একটি স্ট্রিং পাঠাবে, সার্ভার সেটি উল্টিয়ে (reverse) ক্লায়েন্টের কাছে ফিরিয়ে পাঠাবে।
এই কাজে সকেট প্রোগ্রামিং (socket programming) কনসেপ্ট ব্যবহার করা হবে। ক্লায়েন্ট-সার্ভার সংযোগের জন্য একটি পোর্ট তৈরি করতে হবে। পোর্ট নম্বর একটি التعسفية (arbitrary) সংখ্যা যা সকেট দ্বারা ব্যবহার করা হয়। ক্লায়েন্ট এবং সার্ভার উভয়ের জন্য একই পোর্ট নম্বর ব্যবহার করতে হবে।
প্রোগ্রাম চালু করতে প্রথমে সার্ভার প্রোগ্রামটি কম্পাইল ও রান করুন:
gcc Server.c -o server
তারপর ক্লায়েন্ট প্রোগ্রামটি কম্পাইল ও রান করুন:
gcc Client.c -o client
এখন সার্ভার ক্লায়েন্ট থেকে স্ট্রিং পাওয়ার জন্য অপেক্ষা করবে। ক্লায়েন্ট সাইড থেকে একটি স্ট্রিং ইনপুট নেওয়া হবে, যা সার্ভারে প্রেরিত হবে। সার্ভার স্ট্রিংটি প্রিন্ট করবে এবং উল্টা স্ট্রিংটি ক্লায়েন্টের কাছে পাঠিয়ে দেবে। ক্লায়েন্ট সার্ভার থেকে প্রাপ্ত উল্টা স্ট্রিংটি প্রিন্ট করবে।
ক্লায়েন্ট সাইড কোড
//Client Side Code
#include <arpa/inet.h>
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <unistd.h>
#include <string.h>
#define PORT 4000
int main() {
struct sockaddr_in address;
int my_socket = 0, valread;
struct sockaddr_in server_address;
char str[100];
int l;
printf("Enter a String: ");
fgets(str, 100, stdin); // নতুন লাইন চাপা পর্যন্ত স্ট্রিং পড়ে
char buffer[1024] = { 0 }; // বাফার তৈরি ও শূন্য দিয়ে ভরা
// সকেট ফাইল ডেসক্রিপ্টর তৈরি
if ((my_socket = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
printf("\nUnable to create Socket \n");
return -1;
}
memset(&server_address, '0', sizeof(server_address));
server_address.sin_family = AF_INET;
server_address.sin_port = htons(PORT);
if (inet_pton(AF_INET, "127.0.0.1", &server_address.sin_addr) <= 0) {
printf("\nThe address is not supported \n");
return -1;
}
// সকেট সংযোগ
if (connect(my_socket, (struct sockaddr*)&server_address, sizeof(server_address)) < 0) {
printf("\nUnable to connect to the server \n");
return -1;
}
l = strlen(str);
send(my_socket, str, sizeof(str), 0); // সার্ভারে মেসেজ পাঠানো
valread = read(my_socket, str, l); // সার্ভার থেকে মেসেজ পড়া
printf("%s\n", str);
}
সার্ভার সাইড কোড
//Server Side Code
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <unistd.h>
#include <string.h>
#define PORT 4000
char *strrev(char *str){
char *p1, *p2;
if (! str || ! *str)
return str;
for (p1 = str, p2 = str + strlen(str) - 1; p2 > p1; ++p1, --p2){
*p1 ^= *p2;
*p2 ^= *p1;
*p1 ^= *p2;
}
return str;
}
int main() {
int server_fd, new_socket, valread;
struct sockaddr_in address;
char str[100];
int addrlen = sizeof(address);
char buffer[1024] = { 0 };
int i, j, temp;
int l;
char* message = "Welcome to the server"; // প্রারম্ভিক মেসেজ
// সকেট ফাইল ডেসক্রিপ্টর তৈরি
if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
perror("Socket connection failed");
exit(EXIT_FAILURE);
}
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons(PORT);
if (bind(server_fd, (struct sockaddr*)&address, sizeof(address)) < 0) {
perror("Unable to bind with the socket 4000");
exit(EXIT_FAILURE);
}
if (listen(server_fd, 3) < 0) {
perror("Listening.....");
exit(EXIT_FAILURE);
}
if ((new_socket = accept(server_fd, (struct sockaddr*)&address, (socklen_t*)&addrlen)) < 0) {
perror("Accept");
exit(EXIT_FAILURE);
}
// ক্লায়েন্ট থেকে প্রেরিত স্ট্রিং পড়া
valread = read(new_socket, str, sizeof(str));
l = strlen(str);
printf("\nString sent by client:%s\n", str);
strrev(str); // স্ট্রিং উল্টানো
send(new_socket, str, sizeof(str), 0);
printf("\nReversed String is sent\n");
}
আউটপুট
