সকেট প্রোগ্রামিং হল একটি গুরুত্বপূর্ণ প্রযুক্তি যা নেটওয়ার্ক প্রোগ্রামিংয়ের মাধ্যমে একাধিক কম্পিউটার বা প্রোগ্রামকে একে অপরের সাথে যোগাযোগ করতে সহায়তা করে। C ভাষায় সকেট প্রোগ্রামিং দিয়ে ক্লায়েন্ট এবং সার্ভার অ্যাপ্লিকেশন তৈরি করা যায়, যা TCP/IP বা UDP প্রোটোকল ব্যবহার করে ডেটা আদান-প্রদান করে।
সকেট প্রোগ্রামিংয়ে একটি সকেট হল একটি প্রোগ্রামের প্রক্রিয়ার সাথে যুক্ত এক ধরনের পোর্ট, যার মাধ্যমে এটি নেটওয়ার্কের অন্য প্রোগ্রামের সাথে যোগাযোগ স্থাপন করতে পারে। C ভাষায় সকেট প্রোগ্রামিংয়ের মাধ্যমে একটি সার্ভার বা ক্লায়েন্ট অ্যাপ্লিকেশন তৈরি করতে হয় যা TCP বা UDP প্রোটোকল ব্যবহার করে যোগাযোগ করে।
সকেট প্রোগ্রামিং মূলত দুটি প্রকারের প্রোটোকল ব্যবহার করে:
C তে সকেট প্রোগ্রামিং শুরু করার জন্য, sys/socket.h
লাইব্রেরি ইমপোর্ট করতে হয়, যেটি সকেট সম্পর্কিত ফাংশন এবং ডাটা স্ট্রাকচার প্রদান করে।
socket()
ফাংশন ব্যবহার করে সকেট তৈরি করা হয়।bind()
ফাংশন ব্যবহার করে সকেটটিকে একটি পোর্ট এবং আইপি ঠিকানায় বেঁধে দেওয়া হয়।listen()
ফাংশন দ্বারা সার্ভার ক্লায়েন্টের সংযোগের জন্য অপেক্ষা করে।accept()
ফাংশন ব্যবহার করে সার্ভার ক্লায়েন্টের সংযোগ গ্রহণ করে।send()
এবং recv()
ফাংশন ব্যবহার করে ডেটা প্রেরণ এবং গ্রহণ করা হয়।close()
ফাংশন দ্বারা সকেট বন্ধ করা হয়।এখানে একটি TCP সার্ভারের উদাহরণ দেওয়া হল যা একটি ক্লায়েন্ট থেকে বার্তা গ্রহণ করবে এবং তা সাড়া পাঠাবে।
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#define PORT 8080
int main() {
int server_socket, client_socket;
struct sockaddr_in server_addr, client_addr;
socklen_t addr_size;
char buffer[1024];
// সার্ভার সকেট তৈরি করা
server_socket = socket(AF_INET, SOCK_STREAM, 0);
if (server_socket < 0) {
perror("Socket creation failed");
exit(EXIT_FAILURE);
}
// সার্ভার অ্যাড্রেস স্ট্রাকচার সেট করা
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = INADDR_ANY; // যেকোনো নেটওয়ার্ক আইপি ঠিকানা গ্রহণ করবে
server_addr.sin_port = htons(PORT);
// সকেটটি বেঁধে দেওয়া
if (bind(server_socket, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {
perror("Bind failed");
exit(EXIT_FAILURE);
}
// সংযোগের জন্য অপেক্ষা করা
if (listen(server_socket, 10) == 0) {
printf("Server listening on port %d\n", PORT);
} else {
perror("Listen failed");
exit(EXIT_FAILURE);
}
addr_size = sizeof(client_addr);
client_socket = accept(server_socket, (struct sockaddr *)&client_addr, &addr_size);
if (client_socket < 0) {
perror("Client connection failed");
exit(EXIT_FAILURE);
}
printf("Client connected\n");
// ক্লায়েন্ট থেকে বার্তা গ্রহণ করা
recv(client_socket, buffer, sizeof(buffer), 0);
printf("Client says: %s\n", buffer);
// ক্লায়েন্টকে সাড়া পাঠানো
send(client_socket, "Hello from server!", strlen("Hello from server!"), 0);
// সংযোগ বন্ধ করা
close(server_socket);
close(client_socket);
return 0;
}
কোডের ব্যাখ্যা:
socket()
: একটি সকেট তৈরি করে যা TCP সেবা প্রদান করবে।bind()
: সার্ভার সকেটকে একটি পোর্ট এবং আইপি ঠিকানায় বেঁধে দেওয়া।listen()
: ক্লায়েন্টের সংযোগের জন্য সার্ভার সকেট অপেক্ষা করছে।accept()
: সার্ভার ক্লায়েন্টের সংযোগ গ্রহণ করছে।recv()
: ক্লায়েন্ট থেকে বার্তা গ্রহণ করা।send()
: ক্লায়েন্টকে সাড়া পাঠানো।close()
: সকেট বন্ধ করা।এখানে একটি TCP ক্লায়েন্টের উদাহরণ দেওয়া হল যা সার্ভারের সাথে সংযোগ স্থাপন করবে এবং বার্তা পাঠাবে।
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#define SERVER_IP "127.0.0.1"
#define PORT 8080
int main() {
int client_socket;
struct sockaddr_in server_addr;
char *message = "Hello from client!";
char buffer[1024];
// ক্লায়েন্ট সকেট তৈরি করা
client_socket = socket(AF_INET, SOCK_STREAM, 0);
if (client_socket < 0) {
perror("Socket creation failed");
exit(EXIT_FAILURE);
}
// সার্ভারের অ্যাড্রেস সেট করা
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(PORT);
server_addr.sin_addr.s_addr = inet_addr(SERVER_IP);
// সার্ভারের সাথে সংযোগ স্থাপন করা
if (connect(client_socket, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {
perror("Connection failed");
exit(EXIT_FAILURE);
}
// সার্ভারকে বার্তা পাঠানো
send(client_socket, message, strlen(message), 0);
// সার্ভার থেকে সাড়া গ্রহণ করা
recv(client_socket, buffer, sizeof(buffer), 0);
printf("Server says: %s\n", buffer);
// সংযোগ বন্ধ করা
close(client_socket);
return 0;
}
কোডের ব্যাখ্যা:
socket()
: ক্লায়েন্ট সকেট তৈরি করা।connect()
: সার্ভারের সাথে সংযোগ স্থাপন করা।send()
: সার্ভারে বার্তা পাঠানো।recv()
: সার্ভার থেকে সাড়া গ্রহণ করা।close()
: সকেট বন্ধ করা।UDP সকেট প্রোগ্রামিং TCP এর মতো কিন্তু এটি কানেকশনলেস প্রোটোকল, যার ফলে এটি দ্রুত যোগাযোগ করতে সক্ষম, তবে ডেটার সঠিকতা বা অর্ডার গ্যারান্টি দেয় না।
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#define PORT 8080
int main() {
int server_socket;
struct sockaddr_in server_addr, client_addr;
socklen_t addr_size;
char buffer[1024];
// UDP সকেট তৈরি করা
server_socket = socket(AF_INET, SOCK_DGRAM, 0);
if (server_socket < 0) {
perror("Socket creation failed");
exit(EXIT_FAILURE);
}
// সার্ভারের অ্যাড্রেস সেট করা
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(PORT);
server_addr.sin_addr.s_addr = INADDR_ANY;
// সার্ভারের অ্যাড্রেসে সকেট বেঁধে দেওয়া
if (bind(server_socket, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {
perror("Bind failed");
exit(EXIT_FAILURE);
}
printf("UDP Server listening on port %d\n", PORT);
// ক্লায়েন্ট থেকে বার্তা গ্রহণ করা
addr_size = sizeof(client_addr);
recvfrom(server_socket, buffer, sizeof(buffer), 0, (struct sockaddr *)&client_addr, &addr_size);
printf("Received: %s\n", buffer);
// ক্লায়েন্টকে সাড়া পাঠানো
sendto(server_socket, "Hello from server!", strlen("Hello from server!"), 0, (struct sockaddr *)&client_addr, addr_size);
// সকেট বন্ধ করা
close(server_socket);
return
0;
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#define SERVER_IP "127.0.0.1"
#define PORT 8080
int main() {
int client_socket;
struct sockaddr_in server_addr;
char *message = "Hello from client!";
char buffer[1024];
// UDP সকেট তৈরি করা
client_socket = socket(AF_INET, SOCK_DGRAM, 0);
if (client_socket < 0) {
perror("Socket creation failed");
exit(EXIT_FAILURE);
}
// সার্ভারের অ্যাড্রেস সেট করা
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(PORT);
server_addr.sin_addr.s_addr = inet_addr(SERVER_IP);
// সার্ভারে বার্তা পাঠানো
sendto(client_socket, message, strlen(message), 0, (struct sockaddr *)&server_addr, sizeof(server_addr));
// সার্ভার থেকে সাড়া গ্রহণ করা
recvfrom(client_socket, buffer, sizeof(buffer), 0, NULL, NULL);
printf("Server says: %s\n", buffer);
// সকেট বন্ধ করা
close(client_socket);
return 0;
}
C তে সকেট প্রোগ্রামিংয়ের মাধ্যমে আপনি TCP এবং UDP প্রোটোকল ব্যবহার করে সার্ভার এবং ক্লায়েন্ট অ্যাপ্লিকেশন তৈরি করতে পারবেন। এতে সংযোগ স্থাপন, ডেটা প্রেরণ এবং গ্রহণের জন্য বিভিন্ন ফাংশন ব্যবহার করা হয়। TCP প্রোটোকল যেখানে সঠিকতা এবং ডেটার অর্ডার নিশ্চিত করে, সেখানে UDP প্রোটোকল দ্রুত ডেটা পাঠানোর জন্য ব্যবহৃত হয়, তবে এটি অর্ডার বা সঠিকতা নিশ্চিত করে না।
common.read_more