Socket Programming-এ Socket Creation এবং Initialization হলো ক্লায়েন্ট এবং সার্ভারের মধ্যে যোগাযোগ স্থাপনের প্রথম ধাপ। এই ধাপে Socket তৈরি এবং সেটআপ করা হয়, যাতে এটি সঠিকভাবে নেটওয়ার্ক সংযোগ স্থাপন এবং ডেটা আদান-প্রদানে সক্ষম হয়। এই প্রক্রিয়ার মাধ্যমে, একটি Socket একটি নির্দিষ্ট IP Address Family, Socket Type, এবং প্রোটোকল নির্ধারণ করে তৈরি করা হয়।
Socket তৈরি করতে socket()
System Call ব্যবহার করা হয়। এটি Socket-এর জন্য একটি ফাইল ডেসক্রিপ্টর (file descriptor) তৈরি করে এবং তা ক্লায়েন্ট বা সার্ভারের মাধ্যমে নেটওয়ার্ক যোগাযোগের জন্য ব্যবহৃত হয়।
Syntax:
int socket(int domain, int type, int protocol);
domain: Address family নির্দেশ করে, যা Socket-এর মাধ্যমে কোন প্রোটোকল ব্যবহার করা হবে তা নির্ধারণ করে। সাধারণত ব্যবহৃত ডোমেইনগুলো হলো:
AF_INET
(IPv4) - IPv4 ঠিকানা ব্যবহারের জন্য।AF_INET6
(IPv6) - IPv6 ঠিকানা ব্যবহারের জন্য।AF_UNIX
(Unix Domain Sockets) - একই সিস্টেমে প্রসেসগুলোর মধ্যে যোগাযোগের জন্য।type: Socket-এর ধরন নির্দেশ করে, যা সংযোগের পদ্ধতি নির্ধারণ করে। সাধারণত ব্যবহৃত টাইপগুলো হলো:
SOCK_STREAM
(TCP) - কানেকশন-অরিয়েন্টেড এবং নির্ভরযোগ্য যোগাযোগের জন্য।SOCK_DGRAM
(UDP) - কানেকশনলেস এবং দ্রুত যোগাযোগের জন্য।protocol: সাধারণত 0
রাখা হয়, যা ডিফল্ট প্রোটোকল ব্যবহার করে। এটি নির্দিষ্ট প্রোটোকল যেমন TCP বা UDP এর সাথে সংশ্লিষ্ট হয়।
উদাহরণ:
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
AF_INET
IPv4 ঠিকানার জন্য, SOCK_STREAM
TCP প্রোটোকলের জন্য, এবং 0
ডিফল্ট প্রোটোকল নির্ধারণ করার জন্য ব্যবহৃত হয়েছে।-1
রিটার্ন করে, যা ত্রুটির নির্দেশ দেয়।Socket Creation-এর পর, Socket Initialization প্রক্রিয়ায় Socket-এর জন্য Address এবং Port Number সেটআপ করা হয়। সার্ভারের ক্ষেত্রে, bind()
System Call ব্যবহার করে IP Address এবং Port Number সেট করা হয়, যাতে এটি নির্দিষ্ট পোর্টে সংযোগ গ্রহণ করতে পারে। ক্লায়েন্টের ক্ষেত্রে, connect()
System Call ব্যবহার করে ক্লায়েন্ট Socket-কে সার্ভারের সাথে সংযুক্ত করা হয়।
সার্ভারের ক্ষেত্রে, Socket Initialization-এর জন্য bind()
এবং listen()
ফাংশন ব্যবহার করা হয়।
bind():
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
struct sockaddr_in server_addr;
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(8080);
server_addr.sin_addr.s_addr = INADDR_ANY;
bind(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr));
server_addr
হলো sockaddr_in
স্ট্রাকচার, যা সার্ভারের ঠিকানা এবং পোর্ট ধারণ করে।htons()
ফাংশন পোর্ট নম্বরকে নেটওয়ার্ক অর্ডারে (network byte order) কনভার্ট করে।listen():
int listen(int sockfd, int backlog);
listen(sockfd, 5);
backlog
হলো সর্বোচ্চ কতটি কানেকশন একসঙ্গে অপেক্ষায় থাকতে পারবে, তা নির্দেশ করে।ক্লায়েন্টের ক্ষেত্রে, connect()
ফাংশন ব্যবহার করা হয়, যা সার্ভারের IP Address এবং Port Number ব্যবহার করে সংযোগ স্থাপন করে।
struct sockaddr_in server_addr;
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(8080);
server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
connect(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr));
inet_addr()
ফাংশন ব্যবহার করে IPv4 ঠিকানাকে নেটওয়ার্ক ফরম্যাটে কনভার্ট করা হয়েছে।server_addr
স্ট্রাকচার সার্ভারের IP Address এবং Port ধারণ করছে।নিচে TCP ভিত্তিক ক্লায়েন্ট এবং সার্ভারের মধ্যে সংযোগ স্থাপনের একটি সাধারণ উদাহরণ দেখানো হলো:
int sockfd, new_sock;
struct sockaddr_in server_addr, client_addr;
socklen_t addr_size;
char buffer[1024];
// Socket তৈরি
sockfd = socket(AF_INET, SOCK_STREAM, 0);
// সার্ভার ঠিকানা সেটআপ
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(8080);
server_addr.sin_addr.s_addr = INADDR_ANY;
// Binding
bind(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr));
// Listening
listen(sockfd, 5);
// Accepting Connection
addr_size = sizeof(client_addr);
new_sock = accept(sockfd, (struct sockaddr*)&client_addr, &addr_size);
// ডেটা পাঠানো এবং গ্রহণ
recv(new_sock, buffer, 1024, 0);
send(new_sock, "Hello, Client!", strlen("Hello, Client!"), 0);
// Socket বন্ধ
close(new_sock);
close(sockfd);
int sockfd;
struct sockaddr_in server_addr;
char buffer[1024];
// Socket তৈরি
sockfd = socket(AF_INET, SOCK_STREAM, 0);
// সার্ভার ঠিকানা সেটআপ
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(8080);
server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
// সার্ভারের সাথে সংযোগ স্থাপন
connect(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr));
// ডেটা পাঠানো এবং গ্রহণ
send(sockfd, "Hello, Server!", strlen("Hello, Server!"), 0);
recv(sockfd, buffer, 1024, 0);
// Socket বন্ধ
close(sockfd);
common.read_more