Socket API এবং এর ব্যবহার (Socket API and Its Usage)

Computer Programming - ইউনিক্স সকেট (Unix Socket)
284
284

Socket API হলো নেটওয়ার্ক প্রোগ্রামিংয়ের একটি সেট অফ ফাংশন এবং টুল, যা ক্লায়েন্ট এবং সার্ভারের মধ্যে যোগাযোগ স্থাপন, ডেটা পাঠানো এবং গ্রহণ করার জন্য ব্যবহৃত হয়। Socket API সাধারণত TCP/IP প্রোটোকল স্ট্যাকের ওপর ভিত্তি করে কাজ করে এবং এটি Unix, Linux, Windows সহ বিভিন্ন অপারেটিং সিস্টেমে উপলব্ধ। এটি নেটওয়ার্ক ভিত্তিক অ্যাপ্লিকেশন তৈরির জন্য ডেভেলপারদের প্রয়োজনীয় ফাংশন এবং ইন্টারফেস প্রদান করে।

১. Socket API কী?

Socket API হলো এমন একটি ইন্টারফেস যা ক্লায়েন্ট এবং সার্ভারের মধ্যে যোগাযোগ স্থাপন এবং ডেটা ট্রান্সফার করার জন্য Socket তৈরি এবং পরিচালনা করতে ব্যবহৃত হয়। এটি নেটওয়ার্ক প্রোগ্রামিংয়ের ভিত্তি হিসেবে কাজ করে এবং বিভিন্ন প্রোগ্রামিং ভাষায় (যেমন C, Python, Java) ব্যবহার করা যায়। Socket API TCP এবং UDP প্রোটোকলের সাথে কাজ করতে সক্ষম এবং এটি বিভিন্ন স্তরে যোগাযোগ নিশ্চিত করতে ব্যবহৃত হয়।

২. Socket API-এর প্রধান ফাংশন

Socket API-তে কিছু প্রধান ফাংশন রয়েছে, যা ক্লায়েন্ট এবং সার্ভারের মধ্যে সংযোগ এবং ডেটা ট্রান্সফার পরিচালনা করতে ব্যবহৃত হয়। নিচে Socket API-এর কিছু গুরুত্বপূর্ণ ফাংশন ও তাদের ব্যবহার উল্লেখ করা হলো:

socket():

  • এই ফাংশনটি একটি নতুন Socket তৈরি করে এবং এটি ক্লায়েন্ট বা সার্ভারের মাধ্যমে নেটওয়ার্ক যোগাযোগের জন্য ব্যবহৃত হয়।
  • এটি IP Address Family (যেমন AF_INET IPv4 এর জন্য), Socket Type (যেমন SOCK_STREAM TCP এর জন্য, SOCK_DGRAM UDP এর জন্য), এবং প্রোটোকল ব্যবহার করে একটি Socket তৈরি করে।
int sockfd = socket(AF_INET, SOCK_STREAM, 0);

এখানে AF_INET IPv4 ঠিকানার জন্য, SOCK_STREAM TCP-এর জন্য, এবং 0 প্রোটোকল ডিফল্ট হিসেবে ব্যবহার করা হয়েছে।

bind():

  • এই ফাংশনটি সার্ভারের ক্ষেত্রে ব্যবহার করা হয়। এটি Socket-কে একটি নির্দিষ্ট IP Address এবং Port Number-এর সাথে সংযুক্ত করে।
bind(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr));

এখানে sockfd হলো Socket, server_addr হলো সার্ভারের IP Address এবং Port-এর তথ্য ধারণকারী স্ট্রাকচার।

listen():

  • সার্ভারকে ইনকামিং সংযোগের জন্য অপেক্ষা করতে এবং এক বা একাধিক ক্লায়েন্টের জন্য প্রস্তুত করতে listen() ফাংশন ব্যবহার করা হয়।

উদাহরণ:

listen(sockfd, 5);

এখানে 5 হলো ব্যাকলগ (backlog), যা সর্বোচ্চ কতটি কানেকশন একসঙ্গে অপেক্ষায় থাকতে পারবে তা নির্দেশ করে।

accept():

  • সার্ভার যখন কোনো ইনকামিং সংযোগ গ্রহণ করে, তখন accept() ফাংশন ব্যবহার করা হয়। এটি একটি নতুন Socket তৈরি করে, যা সার্ভার এবং ক্লায়েন্টের মধ্যে ডেটা ট্রান্সফারের জন্য ব্যবহৃত হয়।

উদাহরণ

int new_sockfd = accept(sockfd, (struct sockaddr *)&client_addr, &client_len);

এখানে new_sockfd হলো ক্লায়েন্টের সাথে সংযোগ স্থাপনকারী নতুন Socket, client_addr হলো ক্লায়েন্টের ঠিকানা এবং client_len হলো এর আকার।

connect():

  • ক্লায়েন্ট যখন সার্ভারের সাথে সংযোগ স্থাপন করতে চায়, তখন connect() ফাংশন ব্যবহার করা হয়। এটি সার্ভারের IP Address এবং Port Number ব্যবহার করে সংযোগ স্থাপন করে।

উদাহরণ

connect(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr));

এখানে sockfd হলো ক্লায়েন্টের Socket এবং server_addr হলো সার্ভারের ঠিকানা।

send() এবং recv():

  • একবার সংযোগ স্থাপিত হলে, ক্লায়েন্ট এবং সার্ভার উভয়েই send() এবং recv() ফাংশনের মাধ্যমে ডেটা পাঠাতে এবং গ্রহণ করতে পারে।

উদাহরণ:

send(sockfd, "Hello, Server!", strlen("Hello, Server!"), 0);
recv(sockfd, buffer, sizeof(buffer), 0);

এখানে ক্লায়েন্ট send() ফাংশনের মাধ্যমে সার্ভারে বার্তা পাঠাচ্ছে এবং recv() ফাংশনের মাধ্যমে সার্ভার থেকে বার্তা গ্রহণ করছে।

close():

  • Socket বন্ধ করার জন্য close() ফাংশন ব্যবহার করা হয়, যা সংযোগ সম্পন্ন হলে ক্লায়েন্ট এবং সার্ভার উভয়েই ব্যবহার করতে পারে।

উদাহরণ:

close(sockfd);

Socket API-এর ব্যবহার এবং উদাহরণ

Socket API সাধারণত TCP এবং UDP প্রোটোকল ব্যবহার করে ক্লায়েন্ট এবং সার্ভারের মধ্যে যোগাযোগ স্থাপন করতে ব্যবহৃত হয়। নিচে TCP ভিত্তিক ক্লায়েন্ট এবং সার্ভার অ্যাপ্লিকেশন তৈরির একটি সাধারণ উদাহরণ দেওয়া হলো:

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);

TCP ক্লায়েন্ট প্রোগ্রাম

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);

 

Socket API-এর সুবিধা

  • নেটওয়ার্ক অ্যাপ্লিকেশন ডেভেলপমেন্ট: Socket API ক্লায়েন্ট-সার্ভার ভিত্তিক অ্যাপ্লিকেশন তৈরিতে সহজ এবং কার্যকর উপায় প্রদান করে।
  • নির্ভরযোগ্য যোগাযোগ: TCP প্রোটোকলের মাধ্যমে Socket API নির্ভরযোগ্য এবং অর্ডারড ডেটা ট্রান্সফার নিশ্চিত করে।
  • বহুবিধ প্রোটোকল সমর্থন: TCP এবং UDP সহ বিভিন্ন প্রোটোকল ব্যবহার করে নেটওয়ার্ক অ্যাপ্লিকেশন তৈরি করা সম্ভব।
  • স্কেলেবিলিটি: একাধিক ক্লায়েন্ট এবং সার্ভারের মধ্যে যোগাযোগ সহজে স্কেল করা যায়।

৫. Socket API-এর সীমাবদ্ধতা

  • কোডিং জটিলতা: Socket API ব্যবহার করে কোডিং করা কিছুটা জটিল হতে পারে, বিশেষ করে যখন একাধিক সংযোগ এবং মাল্টিথ্রেডিং ব্যবহৃত হয়।
  • নিরাপত্তা ঝুঁকি: সঠিকভাবে ব্যবহৃত না হলে Socket API নিরাপত্তা ঝুঁকির কারণ হতে পারে, যেমন ডিডস (DDoS) আক্রমণ।

 

common.content_added_by

Socket API এর ভূমিকা এবং প্রয়োজনীয়তা

224
224

Socket API এর ভূমিকা এবং প্রয়োজনীয়তা

Socket API হলো নেটওয়ার্ক প্রোগ্রামিংয়ের একটি মৌলিক ইন্টারফেস, যা ক্লায়েন্ট এবং সার্ভারের মধ্যে ডেটা আদান-প্রদান এবং যোগাযোগ স্থাপন করতে ব্যবহৃত হয়। এটি ক্লায়েন্ট-সার্ভার ভিত্তিক নেটওয়ার্ক অ্যাপ্লিকেশন এবং পরিষেবা তৈরি এবং পরিচালনার জন্য অপরিহার্য। Socket API বিভিন্ন প্রোগ্রামিং ভাষায় ব্যবহৃত হয় (যেমন C, Python, Java) এবং TCP/IP প্রোটোকল স্ট্যাকের মাধ্যমে কাজ করে।

Socket API এর ভূমিকা

ক্লায়েন্ট-সার্ভার মডেল তৈরি করা:

  • Socket API ক্লায়েন্ট এবং সার্ভার অ্যাপ্লিকেশন তৈরি করতে ব্যবহৃত হয়। এটি ক্লায়েন্টকে সার্ভারের সাথে সংযোগ স্থাপন করতে এবং ডেটা পাঠাতে ও গ্রহণ করতে সক্ষম করে।
  • ক্লায়েন্ট-সার্ভার মডেলে, ক্লায়েন্ট একটি অনুরোধ পাঠায় এবং সার্ভার সেই অনুরোধের জন্য উপযুক্ত সাড়া প্রদান করে। Socket API এই প্রক্রিয়াটি সহজ এবং কার্যকর উপায়ে পরিচালনা করতে সাহায্য করে।

নেটওয়ার্ক সংযোগ স্থাপন করা:

  • Socket API-এর মাধ্যমে ক্লায়েন্ট এবং সার্ভার সঠিক IP Address এবং Port Number ব্যবহার করে সংযোগ স্থাপন করতে পারে। এটি TCP/IP প্রোটোকল স্ট্যাকের মাধ্যমে নেটওয়ার্ক সংযোগ নিশ্চিত করে এবং ডেটা প্যাকেটগুলোর আদান-প্রদান পরিচালনা করে।

ডেটা ট্রান্সফার পরিচালনা করা:

  • Socket API-এর মাধ্যমে ডেটা পাঠানো এবং গ্রহণ করার ফাংশন প্রদান করে, যেমন send() এবং recv()। এটি ক্লায়েন্ট এবং সার্ভারের মধ্যে সঠিকভাবে ডেটা ট্রান্সফার নিশ্চিত করতে সাহায্য করে।
  • TCP প্রোটোকলের মাধ্যমে নির্ভরযোগ্য এবং অর্ডারড ডেটা ট্রান্সফার নিশ্চিত করা যায়, যেখানে UDP দ্রুত কিন্তু কম নির্ভরযোগ্য ডেটা ট্রান্সফার নিশ্চিত করে।

কানেকশন ম্যানেজমেন্ট:

  • Socket API সার্ভারকে ইনকামিং সংযোগ গ্রহণ করতে (accept()), সংযোগের জন্য অপেক্ষা করতে (listen()), এবং ক্লায়েন্টের সাথে সংযোগ স্থাপন করতে (connect()) সহায়ক হয়।
  • এটি ক্লায়েন্ট এবং সার্ভারের মধ্যে সেশন স্থাপন, মেইনটেনেন্স, এবং টার্মিনেশন পরিচালনা করে, যা ক্লায়েন্ট-সার্ভার ভিত্তিক অ্যাপ্লিকেশনের জন্য অপরিহার্য।

আন্তঃপ্রসেস যোগাযোগ (IPC) প্রদান করা:

  • Unix Domain Sockets (UDS) ব্যবহার করে Socket API লোকাল প্রসেসগুলোর মধ্যে যোগাযোগ স্থাপন করতে পারে। এটি লোকাল ফাইল সিস্টেম বা মেমরি স্ট্রিমের মাধ্যমে একই সিস্টেমে চলমান প্রসেসগুলোর মধ্যে দ্রুত IPC (Inter-Process Communication) নিশ্চিত করে।

Socket API এর প্রয়োজনীয়তা

নেটওয়ার্ক অ্যাপ্লিকেশন ডেভেলপমেন্ট:

  • Socket API ছাড়া নেটওয়ার্ক অ্যাপ্লিকেশন তৈরি করা প্রায় অসম্ভব। এটি ক্লায়েন্ট এবং সার্ভার মডেলে নেটওয়ার্ক অ্যাপ্লিকেশন তৈরি করার জন্য মৌলিক ইন্টারফেস প্রদান করে।
  • ওয়েব ব্রাউজার, ইমেইল ক্লায়েন্ট, ডাটাবেস অ্যাপ্লিকেশন, এবং ফাইল ট্রান্সফার প্রোগ্রামগুলো Socket API ব্যবহার করে কাজ করে।

রিয়েল-টাইম কমিউনিকেশন:

  • রিয়েল-টাইম চ্যাট অ্যাপ্লিকেশন, ভিডিও স্ট্রিমিং, অনলাইন গেমিং, এবং অন্যান্য রিয়েল-টাইম সেবা Socket API ব্যবহার করে দ্রুত এবং নির্ভরযোগ্য যোগাযোগ নিশ্চিত করে।
  • Socket API ডেভেলপারদের TCP এবং UDP প্রোটোকল ব্যবহার করে নির্দিষ্ট কমিউনিকেশন মডেল তৈরি করতে সহায়তা করে, যা রিয়েল-টাইম অ্যাপ্লিকেশনের জন্য অপরিহার্য।

কাস্টম প্রোটোকল এবং সার্ভিস তৈরি:

  • ডেভেলপাররা Socket API ব্যবহার করে কাস্টম প্রোটোকল তৈরি করতে পারেন, যা তাদের নির্দিষ্ট প্রয়োজন অনুযায়ী সেবা প্রদান করতে সক্ষম।
  • Socket API বিভিন্ন প্রোগ্রামিং ভাষায় ব্যবহার করা যায় এবং কাস্টমাইজড প্রোটোকল ইমপ্লিমেন্টেশন ও পরিচালনা সহজ করে।

ইন্টার-প্রসেস কমিউনিকেশন (IPC):

  • Socket API লোকাল প্রসেসগুলোর মধ্যে দ্রুত এবং কার্যকর যোগাযোগের উপায় প্রদান করে। Unix Domain Sockets (UDS) ব্যবহার করে একই সিস্টেমে চলমান প্রসেসগুলোর মধ্যে ডেটা ট্রান্সফার এবং যোগাযোগ সহজ হয়।

নেটওয়ার্কিং এবং সিকিউরিটি টুলস:

  • নেটওয়ার্ক এনালাইসিস টুল (যেমন tcpdump, Wireshark) এবং সিকিউরিটি টুল (যেমন ফায়ারওয়াল) Socket API ব্যবহার করে নেটওয়ার্ক প্যাকেট ম্যানেজমেন্ট এবং প্যাকেট ফিল্টারিং করে।
  • এটি নেটওয়ার্ক প্যাকেট কেপচার, কাস্টম প্যাকেট তৈরি, এবং প্যাকেট সিকিউরিটি চেকিং পরিচালনা করতে সহায়ক হয়।

Socket API এর ব্যবহার

Socket API ব্যবহার করে একটি সাধারণ TCP ক্লায়েন্ট-সার্ভার মডেল তৈরি করা যায়। নিচে একটি উদাহরণ হিসেবে TCP সার্ভার এবং ক্লায়েন্টের মধ্যে যোগাযোগের একটি প্রক্রিয়া দেখানো হলো:

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);

 

TCP ক্লায়েন্ট উদাহরণ

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.content_added_by

Socket System Calls: socket(), bind(), listen(), accept(), connect(), send(), recv(), close()

294
294

Socket Programming-এ Socket System Calls হলো মূল ফাংশন বা মেথড, যা ক্লায়েন্ট এবং সার্ভারের মধ্যে যোগাযোগ স্থাপন, ডেটা আদান-প্রদান, এবং সংযোগ বন্ধ করতে ব্যবহৃত হয়। নিচে প্রতিটি System Call-এর বিস্তারিত ব্যাখ্যা এবং তাদের ব্যবহার উল্লেখ করা হলো:

১. socket()

কাজ:

  • socket() System Call একটি নতুন Socket তৈরি করে, যা ক্লায়েন্ট বা সার্ভারের মাধ্যমে নেটওয়ার্ক যোগাযোগের জন্য ব্যবহৃত হয়। এটি IP Address Family, Socket Type, এবং প্রোটোকল নির্ধারণ করে।

সিনট্যাক্স:

int socket(int domain, int type, int protocol);
  • domain: Address family নির্দেশ করে (যেমন AF_INET IPv4 এর জন্য, AF_INET6 IPv6 এর জন্য)।
  • type: Socket এর ধরন নির্দেশ করে (যেমন SOCK_STREAM TCP এর জন্য, SOCK_DGRAM UDP এর জন্য)।
  • protocol: সাধারণত 0 রাখা হয়, যা ডিফল্ট প্রোটোকল নির্ধারণ করে।

উদাহরণ:

 

int sockfd = socket(AF_INET, SOCK_STREAM, 0);

২. bind()

কাজ:

  • bind() System Call একটি Socket-কে নির্দিষ্ট IP Address এবং Port Number-এর সাথে সংযুক্ত করে। এটি সাধারণত সার্ভারের ক্ষেত্রে ব্যবহৃত হয়।

সিনট্যাক্স:

int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
  • sockfd: Socket file descriptor, যা socket() System Call থেকে ফেরত আসে।
  • addr: একটি স্ট্রাকচার, যা Socket-এর IP Address এবং Port Number ধারণ করে।
  • addrlen: addr স্ট্রাকচারের আকার নির্দেশ করে।

উদাহরণ:

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));

৩. listen()

কাজ:

  • listen() System Call সার্ভার Socket-কে ইনকামিং সংযোগের জন্য প্রস্তুত করে। এটি এক বা একাধিক ক্লায়েন্ট সংযোগ গ্রহণের জন্য সার্ভারকে অপেক্ষমাণ অবস্থায় রাখে।

সিনট্যাক্স:

int listen(int sockfd, int backlog);
  • sockfd: Socket file descriptor, যা bind() System Call থেকে সংযুক্ত করা হয়েছে।
  • backlog: সর্বোচ্চ কতটি কানেকশন একসঙ্গে অপেক্ষায় থাকতে পারবে, তা নির্দেশ করে।

উদাহরণ:

listen(sockfd, 5);

৪. accept()

কাজ:

  • accept() System Call ইনকামিং সংযোগ গ্রহণ করে এবং ক্লায়েন্টের সাথে একটি নতুন Socket তৈরি করে, যা ডেটা ট্রান্সফার করার জন্য ব্যবহৃত হয়।

সিনট্যাক্স:

int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

sockfd: Socket file descriptor, যা ইনকামিং সংযোগের জন্য অপেক্ষা করছে।
  • addr: ক্লায়েন্টের IP Address এবং Port সংরক্ষণের জন্য একটি স্ট্রাকচার।
  • addrlen: ক্লায়েন্টের অ্যাড্রেস স্ট্রাকচারের আকার নির্দেশ করে।

উদাহরণ:

struct sockaddr_in client_addr;
socklen_t addr_size = sizeof(client_addr);
int new_sockfd = accept(sockfd, (struct sockaddr*)&client_addr, &addr_size);

৫. connect()

কাজ:

  • connect() System Call ক্লায়েন্ট Socket-কে সার্ভারের সাথে সংযোগ স্থাপন করতে ব্যবহৃত হয়। এটি সার্ভারের IP Address এবং Port Number ব্যবহার করে সংযোগ স্থাপন করে।

সিনট্যাক্স:

int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
  • sockfd: ক্লায়েন্ট Socket file descriptor।
  • addr: সার্ভারের ঠিকানা সংরক্ষিত স্ট্রাকচার।
  • addrlen: ঠিকানা স্ট্রাকচারের আকার নির্দেশ করে।

উদাহরণ:

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));

৬. send()

কাজ:

  • send() System Call ডেটা পাঠানোর জন্য ব্যবহৃত হয়। এটি TCP সংযোগে ডেটা ট্রান্সমিট করার জন্য Socket ব্যবহার করে।

সিনট্যাক্স:

ssize_t send(int sockfd, const void *buf, size_t len, int flags);
  • sockfd: সংযোগ স্থাপিত Socket file descriptor।
  • buf: ডেটা সংরক্ষণকারী বাফার পয়েন্টার।
  • len: ডেটার দৈর্ঘ্য।
  • flags: অতিরিক্ত ফ্ল্যাগ (সাধারণত 0)।

উদাহরণ:

char *message = "Hello, Server!";
send(sockfd, message, strlen(message), 0);

৭. recv()

কাজ:

  • recv() System Call ডেটা গ্রহণের জন্য ব্যবহৃত হয়। এটি TCP সংযোগে ইনকামিং ডেটা প্যাকেট গ্রহণ করতে Socket ব্যবহার করে।

সিনট্যাক্স:

ssize_t recv(int sockfd, void *buf, size_t len, int flags);
  • sockfd: সংযোগ স্থাপিত Socket file descriptor।
  • buf: ডেটা গ্রহণের জন্য বাফার পয়েন্টার।
  • len: বাফারের দৈর্ঘ্য।
  • flags: অতিরিক্ত ফ্ল্যাগ (সাধারণত 0)।

উদাহরণ:

char buffer[1024];
recv(sockfd, buffer, sizeof(buffer), 0);

৮. close()

কাজ:

  • close() System Call একটি Socket বন্ধ করতে ব্যবহৃত হয়। এটি সংযোগ বন্ধ করার এবং Socket রিসোর্স মুক্ত করার জন্য ব্যবহার করা হয়।

সিনট্যাক্স:

int close(int sockfd);
  • sockfd: বন্ধ করতে চাওয়া Socket file descriptor।

উদাহরণ:

close(sockfd);

সংক্ষেপে Socket System Calls-এর কাজের ধাপ:

  1. সার্ভার:
    • socket()bind()listen()accept()recv()/send()close()
  2. ক্লায়েন্ট:
    • socket()connect()send()/recv()close()
common.content_added_by

Socket Creation এবং Initialization

268
268

Socket Programming-এ Socket Creation এবং Initialization হলো ক্লায়েন্ট এবং সার্ভারের মধ্যে যোগাযোগ স্থাপনের প্রথম ধাপ। এই ধাপে Socket তৈরি এবং সেটআপ করা হয়, যাতে এটি সঠিকভাবে নেটওয়ার্ক সংযোগ স্থাপন এবং ডেটা আদান-প্রদানে সক্ষম হয়। এই প্রক্রিয়ার মাধ্যমে, একটি Socket একটি নির্দিষ্ট IP Address Family, Socket Type, এবং প্রোটোকল নির্ধারণ করে তৈরি করা হয়।

১. Socket Creation (Socket তৈরি করা)

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 ডিফল্ট প্রোটোকল নির্ধারণ করার জন্য ব্যবহৃত হয়েছে।
  • যদি Socket সফলভাবে তৈরি হয়, তাহলে এটি একটি পজিটিভ ফাইল ডেসক্রিপ্টর (file descriptor) রিটার্ন করে; অন্যথায় এটি -1 রিটার্ন করে, যা ত্রুটির নির্দেশ দেয়।

২. Socket Initialization (Socket-এর Initialization)

Socket Creation-এর পর, Socket Initialization প্রক্রিয়ায় Socket-এর জন্য Address এবং Port Number সেটআপ করা হয়। সার্ভারের ক্ষেত্রে, bind() System Call ব্যবহার করে IP Address এবং Port Number সেট করা হয়, যাতে এটি নির্দিষ্ট পোর্টে সংযোগ গ্রহণ করতে পারে। ক্লায়েন্টের ক্ষেত্রে, connect() System Call ব্যবহার করে ক্লায়েন্ট Socket-কে সার্ভারের সাথে সংযুক্ত করা হয়।

সার্ভারের ক্ষেত্রে Initialization

সার্ভারের ক্ষেত্রে, Socket Initialization-এর জন্য bind() এবং listen() ফাংশন ব্যবহার করা হয়।

bind():

  • সার্ভারের IP Address এবং Port Number-কে Socket-এর সাথে সংযুক্ত করে।
  • Syntax:
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():

  • সার্ভার Socket-কে ইনকামিং সংযোগ গ্রহণের জন্য প্রস্তুত করে।
  • Syntax:
int listen(int sockfd, int backlog);
  • উদাহরণ:
listen(sockfd, 5);
  • এখানে, backlog হলো সর্বোচ্চ কতটি কানেকশন একসঙ্গে অপেক্ষায় থাকতে পারবে, তা নির্দেশ করে।

ক্লায়েন্টের ক্ষেত্রে Initialization

ক্লায়েন্টের ক্ষেত্রে, connect() ফাংশন ব্যবহার করা হয়, যা সার্ভারের IP Address এবং Port Number ব্যবহার করে সংযোগ স্থাপন করে।

  1. connect():
    • ক্লায়েন্ট Socket-কে সার্ভারের সাথে সংযোগ স্থাপন করতে ব্যবহৃত হয়।
    • Syntax:int connect(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 = inet_addr("127.0.0.1");
connect(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr));
  • এখানে, inet_addr() ফাংশন ব্যবহার করে IPv4 ঠিকানাকে নেটওয়ার্ক ফরম্যাটে কনভার্ট করা হয়েছে।
  • server_addr স্ট্রাকচার সার্ভারের IP Address এবং Port ধারণ করছে।

৩. Socket Creation এবং Initialization এর পূর্ণাঙ্গ উদাহরণ

নিচে TCP ভিত্তিক ক্লায়েন্ট এবং সার্ভারের মধ্যে সংযোগ স্থাপনের একটি সাধারণ উদাহরণ দেখানো হলো:

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);

TCP ক্লায়েন্ট প্রোগ্রাম

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.content_added_by

Server এবং Client Side Socket Programming এর উদাহরণ

221
221

Socket Programming-এ ক্লায়েন্ট এবং সার্ভার উভয়কেই Socket ব্যবহার করে নেটওয়ার্কে যোগাযোগ স্থাপন করতে হয়। নিচে TCP (Transmission Control Protocol) ব্যবহার করে একটি সাধারণ ক্লায়েন্ট-সার্ভার অ্যাপ্লিকেশন উদাহরণ দেখানো হয়েছে, যেখানে সার্ভার একটি নির্দিষ্ট পোর্টে সংযোগ গ্রহণ করে এবং ক্লায়েন্ট সেই সার্ভারের সাথে সংযোগ স্থাপন করে ডেটা আদান-প্রদান করে।

TCP সার্ভার প্রোগ্রাম উদাহরণ (C ভাষায়)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#define PORT 8080
int main() {
   int server_fd, new_socket;
   struct sockaddr_in address;
   int addrlen = sizeof(address);
   char buffer[1024] = {0};
   char *hello = "Hello from server";
   // 1. Socket তৈরি করা
   if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
       perror("Socket creation failed");
       exit(EXIT_FAILURE);
   }
   // 2. সার্ভার ঠিকানা সেটআপ করা
   address.sin_family = AF_INET;
   address.sin_addr.s_addr = INADDR_ANY;
   address.sin_port = htons(PORT);
   // 3. Binding করা
   if (bind(server_fd, (struct sockaddr*)&address, sizeof(address)) < 0) {
       perror("Bind failed");
       exit(EXIT_FAILURE);
   }
   // 4. Listening করা
   if (listen(server_fd, 3) < 0) {
       perror("Listen failed");
       exit(EXIT_FAILURE);
   }
   printf("Server is listening on port %d\n", PORT);
   // 5. Accepting সংযোগ
   if ((new_socket = accept(server_fd, (struct sockaddr*)&address, (socklen_t*)&addrlen)) < 0) {
       perror("Accept failed");
       exit(EXIT_FAILURE);
   }
   // 6. ডেটা গ্রহণ করা
   read(new_socket, buffer, 1024);
   printf("Client: %s\n", buffer);
   // 7. ডেটা পাঠানো
   send(new_socket, hello, strlen(hello), 0);
   printf("Hello message sent to client\n");
   // 8. Socket বন্ধ করা
   close(new_socket);
   close(server_fd);
   return 0;
}

TCP ক্লায়েন্ট প্রোগ্রাম উদাহরণ (C ভাষায়)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#define PORT 8080
int main() {
   int sock = 0;
   struct sockaddr_in serv_addr;
   char *hello = "Hello from client";
   char buffer[1024] = {0};
   // 1. Socket তৈরি করা
   if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
       printf("Socket creation failed\n");
       return -1;
   }
   // 2. সার্ভার ঠিকানা সেটআপ করা
   serv_addr.sin_family = AF_INET;
   serv_addr.sin_port = htons(PORT);
   // 3. IP Address সেট করা
   if (inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr) <= 0) {
       printf("Invalid address or Address not supported\n");
       return -1;
   }
   // 4. সার্ভারের সাথে সংযোগ স্থাপন করা
   if (connect(sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) < 0) {
       printf("Connection Failed\n");
       return -1;
   }
   // 5. ডেটা পাঠানো
   send(sock, hello, strlen(hello), 0);
   printf("Hello message sent to server\n");
   // 6. ডেটা গ্রহণ করা
   read(sock, buffer, 1024);
   printf("Server: %s\n", buffer);
   // 7. Socket বন্ধ করা
   close(sock);
   return 0;
}

প্রোগ্রামগুলোর বিশ্লেষণ

সার্ভার প্রোগ্রাম:

Socket তৈরি:

  • socket() System Call ব্যবহার করে সার্ভার Socket তৈরি করা হয়, যা AF_INET (IPv4) এবং SOCK_STREAM (TCP) ব্যবহার করে।

Binding:

  • bind() ফাংশন সার্ভার Socket-কে একটি নির্দিষ্ট IP Address এবং Port Number (8080) এর সাথে সংযুক্ত করে, যাতে এটি ইনকামিং সংযোগ গ্রহণ করতে পারে।

Listening:

  • listen() ফাংশন সার্ভার Socket-কে ইনকামিং সংযোগ গ্রহণের জন্য অপেক্ষা করতে প্রস্তুত করে। এখানে 3 প্যারামিটারটি ব্যাকলগ নির্দেশ করে, যা সার্ভার কতটি ইনকামিং সংযোগ কিউতে রাখতে পারবে।

Accepting সংযোগ:

  • accept() ফাংশন ব্যবহার করে ইনকামিং সংযোগ গ্রহণ করা হয় এবং একটি নতুন Socket তৈরি করা হয়, যা ক্লায়েন্টের সাথে ডেটা ট্রান্সফারের জন্য ব্যবহৃত হয়।

ডেটা পাঠানো এবং গ্রহণ:

  • read() এবং send() ফাংশন ব্যবহার করে ক্লায়েন্ট থেকে ডেটা গ্রহণ এবং ক্লায়েন্টে ডেটা পাঠানো হয়।

Socket বন্ধ করা:

  • close() ফাংশন ব্যবহার করে সার্ভার এবং ক্লায়েন্ট Socket বন্ধ করা হয়।

ক্লায়েন্ট প্রোগ্রাম:

Socket তৈরি:

  • socket() System Call ব্যবহার করে ক্লায়েন্ট Socket তৈরি করা হয়।

সার্ভারের ঠিকানা সেটআপ:

  • inet_pton() ফাংশন ব্যবহার করে সার্ভারের IP Address (127.0.0.1, যা localhost) এবং Port Number (8080) সেট করা হয়।

সার্ভারের সাথে সংযোগ স্থাপন:

  • connect() ফাংশন ব্যবহার করে সার্ভারের সাথে সংযোগ স্থাপন করা হয়।

ডেটা পাঠানো এবং গ্রহণ:

  • send() এবং read() ফাংশন ব্যবহার করে ক্লায়েন্ট ডেটা পাঠায় এবং সার্ভার থেকে ডেটা গ্রহণ করে।

Socket বন্ধ করা:

  • close() ফাংশন ব্যবহার করে ক্লায়েন্ট Socket বন্ধ করা হয়।

কিভাবে এই প্রোগ্রামগুলো চালাবেন

  1. প্রথমে, সার্ভার প্রোগ্রামটি চালু করুন। এটি একটি নির্দিষ্ট পোর্টে (এখানে 8080) ইনকামিং সংযোগের জন্য অপেক্ষা করবে।
  2. এরপর ক্লায়েন্ট প্রোগ্রামটি চালান। ক্লায়েন্ট প্রোগ্রাম সার্ভারের সাথে সংযোগ স্থাপন করবে এবং বার্তা পাঠাবে।
  3. সার্ভার সেই বার্তা গ্রহণ করবে এবং ক্লায়েন্টকে একটি সাড়া পাঠাবে।
  4. উভয় প্রোগ্রামেই একটি বার্তা প্রদর্শিত হবে, যা দেখাবে যে ক্লায়েন্ট এবং সার্ভার কী পাঠাচ্ছে।
common.content_added_by
টপ রেটেড অ্যাপ

স্যাট অ্যাকাডেমী অ্যাপ

আমাদের অল-ইন-ওয়ান মোবাইল অ্যাপের মাধ্যমে সীমাহীন শেখার সুযোগ উপভোগ করুন।

ভিডিও
লাইভ ক্লাস
এক্সাম
ডাউনলোড করুন
Promotion