
সকেট এরর নেটওয়ার্ক কমিউনিকেশনে খুব সাধারণ এবং এটি প্রসেসের অনেক স্টেজে উত্থান করতে পারে যার মধ্যে কানেকশন স্থাপন, ডেটা ট্রান্সমিশন, এবং ডিসকানেকশন। এই ত্রুটিগুলো যেকোনো কারণ যেমন নেটওয়ার্ক ফেইলার, কানেকশন টাইমআউট, রিসোর্স লিমিটেশন, বা ভুল কনফিগারেশন সেটিংসের কারণে হতে পারে।
আমরা আলোচনা করব সি প্রোগ্রামিং ভাষায় "perror()" এবং "strerror()" ফাংশন ব্যবহার করে সকেট এরর ক্যাচ করার দুটি ভিন্ন পদ্ধতি।
সকেট এরর কী?
সি ভাষায় সকেট এরর প্রধানত নেগেটিভ রিটার্ন ভ্যালু বা সকেট ফাংশন দ্বারা রিটার্ন করা নির্দিষ্ট এরর কোড দ্বারা চেনা যায়। এই এরর কোডগুলো ত্রুটির প্রকৃতি সম্পর্কে মূল্যবান তথ্য প্রদান করে এবং আমাদের সমস্যাগুলো সনাক্ত ও সমাধান করতে সাহায্য করে। যদি সকেট ফাংশন একটি নেগেটিভ ভ্যালু রিটার্ন করে, তার মানে এক্সিকিউশন সময় কিছু ত্রুটি হয়েছে। উদাহরণস্বরূপ, যদি "socket()" ফাংশন একটি সকেট তৈরি করতে ব্যর্থ হয়, তবে এটি ফেইলিউর ইন্ডিকেট করার জন্য একটি নেগেটিভ ভ্যালু রিটার্ন করতে পারে। আমরা এটি চেক করে সহজে সনাক্ত ও প্রতিক্রিয়া জানাতে পারি।
নেগেটিভ রিটার্ন ভ্যালুর পাশাপাশি, সকেট ফাংশনগুলো "errno" ভেরিয়েবলও সেট করে যা একটি গ্লোবাল ভেরিয়েবল যা সবচেয়ে সাম্প্রতিক সিস্টেম বা লাইব্রেরি ফাংশন কলের সাথে জড়িত নির্দিষ্ট এরর কোড সংরক্ষণ করে। "errno" ভেরিয়েবল "<errno.h>" হেডার ফাইল ব্যবহার করে অ্যাক্সেস করা যায় এবং প্রিডিফাইনড এরর কোড থাকে যা ত্রুটির কারণ সম্পর্কে অতিরিক্ত তথ্য শেয়ার করে। রিটার্ন ভ্যালু এবং এরর কোডের তাৎপর্য বুঝতে পারলে, আমরা ত্রুটির উৎস চেনে উপযুক্ত একশন নিতে পারি।
প্রোগ্রামিং উদাহরণ ১: Strerror() ফাংশন ব্যবহার করে সকেট এরর ক্যাচ করা
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
int main ()
{
int socketDescriptor;
struct sockaddr_in serverAddress;
// Create a socket
socketDescriptor = socket (AF_INET, SOCK_STREAM, 0);
if (socketDescriptor < 0)
{
perror ("Socket creation failed");
exit(EXIT_FAILURE);
}
// Set up the server address
serverAddress.sin_family = AF_INET;
// Let us use an example port number
serverAddress.sin_port = htons (7070);
// Local IP address
serverAddress.sin_addr.s_addr = inet_addr ("127.0.0.1");
// Connect to the server
if (connect (socketDescriptor, (struct sockaddr * ) & serverAddress, sizeof (serverAddress)) < 0)
{
perror ("Connection failed");
exit (EXIT_FAILURE);
}
// Send and receive data
// Let us Close the socket
close (socketDescriptor);
return 0;
}
আউটপুট:
$ gcc err.c -o err
$ ./err
Connection failed: Connection refused
ব্যাখ্যা:
এই প্রোগ্রামিং উদাহরণে, আমরা socket() ফাংশন ব্যবহার করে একটি সকেট তৈরি করি। যদি রিটার্ন করা সকেট ডেসক্রিপ্টর ০ এর চেয়ে কম হয়, যা সকেট তৈরির সময় একটি এরর ইন্ডিকেট করে, তবে এটি "perror()" ফাংশন ব্যবহার করে সংশ্লিষ্ট এরর মেসেজ প্রদর্শন করে এবং প্রোগ্রাম থেকে এক্সিট করে। কানেকশন স্থাপন করার জন্য, এটি সার্ভার অ্যাড্রেস সেট আপ করে এবং connect() ফাংশন ব্যবহার করে কানেক্ট করার চেষ্টা করে রিটার্ন ভ্যালু ০ এর চেয়ে কম কিনা চেক করে। কানেকশন ফেইলিউর হলে, "perror()" ফাংশন আবার ব্যবহার করা হয় একটি এরর মেসেজ প্রদর্শন করতে এবং প্রোগ্রাম এক্সিট করবে। এই পদ্ধতিতে, আমরা সি ভাষায় সকেট এরর সহজে ক্যাচ করতে পারি। এটি আমাদের ইনফরমেটিভ এরর মেসেজ দেখাতে এবং প্রোগ্রাম সঠিকভাবে টার্মিনেট করতে সক্ষম করে।
প্রোগ্রামিং উদাহরণ ২: Perror() ফাংশন ব্যবহার করে সকেট এরর ক্যাচ করা
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <string.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <errno.h>
#include <unistd.h>
int main ()
{
int socketDescriptor;
struct sockaddr_in serverAddress;
// Create a socket
socketDescriptor = socket (AF_INET, SOCK_STREAM, 0);
if (socketDescriptor < 0)
{
fprintf (stderr, "Failed to create socket: %s \n", strerror (errno));
exit (EXIT_FAILURE);
}
// Set up the server address
serverAddress.sin_family = AF_INET;
// Let us use an example port number
serverAddress.sin_port = htons (7070);
// Local IP address
serverAddress.sin_addr.s_addr = inet_addr ("127.0.0.1");
// now we attempt for server connection
if (connect (socketDescriptor, (struct sockaddr *) & serverAddress, sizeof (serverAddress)) < 0) {
fprintf (stderr, "Failed to connect: %s\n", strerror (errno));
exit (EXIT_FAILURE);
}
// Send and receive data
// Close the socket
if (close (socketDescriptor) < 0)
{
fprintf (stderr, "Socket closure failed: %s\n", strerror (errno));
exit (EXIT_FAILURE);
}
printf ("Socket closed successfully.\n");
return 0;
}
আউটপুট:
$ gcc error.c -o error
$ ./error
Failed to connect: Connection refused
ব্যাখ্যা:
এই প্রোগ্রামিং উদাহরণে, আমরা সি-তে "strerror()" ফাংশন ব্যবহার করে সকেট এরর ক্যাচ করি। এই ফাংশন আমাদের "errno" ভেরিয়েবলে সংরক্ষিত এরর কোডকে মানব-পাঠযোগ্য এরর মেসেজে রূপান্তর করতে দেয়। "<string.h>" হেডার ফাইল ইনক্লুড করে, আমরা "strerror()" ফাংশন অ্যাক্সেস করতে পারি এবং এরর মেসেজ পেতে "errno" ভ্যালু প্রদান করতে পারি। এই প্রোগ্রামে, সকেট তৈরি করার পর, আমরা চেক করি সকেট ডেসক্রিপ্টর ০ এর চেয়ে কম কিনা যা ফেইলিউর মানে। যদি এরর হয়, আমরা "errno" ভ্যালু সহ "strerror()" ফাংশন ব্যবহার করে একটি এরর মেসেজ রিট্রিভ করি। "fprintf()" ফাংশন স্ট্যান্ডার্ড এরর স্ট্রিমে এরর মেসেজ প্রদর্শন করে। अन्तত, প্রোগ্রাম ফেইলিউর স্ট্যাটাস দিয়ে এক্সিট করে।
উপসংহার
সকেট ফাংশন দ্বারা প্রদত্ত রিটার্ন ভ্যালু এবং এরর কোড বুঝতে পারলে, আমরা সি-তে এই সকেট এরর সহজে ক্যাচ ও হ্যান্ডেল করতে পারি। প্রথম প্রোগ্রামিং উদাহরণে, আমরা ব্যাখ্যা করেছি কীভাবে "perror()" ফাংশন ব্যবহার করে এরর এবং রিটার্ন ভ্যালু ক্যাচ করতে হয়। দ্বিতীয় উদাহরণে, আমরা বিস্তারিত এরর মেসেজ পাওয়ার জন্য "strerror()" ফাংশন ব্যাখ্যা করেছি। এই মেথডগুলো বুঝতে পারলে, আমরা সকেট প্রোগ্রামিং-এ ইনফরমেটিভ এরর মেসেজ প্রদর্শন করতে এবং প্রোগ্রাম সঠিকভাবে টার্মিনেট করতে পারি।
লেখক সম্পর্কে

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