কম্পিউটার টিউটোরিয়াল

সি-তে সকেট ত্রুটি সনাক্ত করা:একটি ব্যবহারিক গাইড

সি-তে সকেট ত্রুটি সনাক্ত করা:একটি ব্যবহারিক গাইড

সকেট ত্রুটিগুলি নেটওয়ার্ক যোগাযোগের একটি খুব সাধারণ ঘটনা এবং এটি সংযোগ স্থাপন, ডেটা ট্রান্সমিশন এবং সংযোগ বিচ্ছিন্ন সহ প্রক্রিয়ার অনেক পর্যায়ে বাড়তে পারে। এই ত্রুটিগুলি নেটওয়ার্ক ব্যর্থতা, সংযোগের সময়সীমা, সম্পদের সীমাবদ্ধতা, বা ভুল কনফিগারেশন সেটিংসের মতো বিস্তৃত কারণগুলির কারণে হতে পারে৷

আসুন "perror()" এবং "strerror()" ফাংশন ব্যবহার করে সি প্রোগ্রামিং ল্যাঙ্গুয়েজে কিভাবে সকেট এরর ধরতে হয় তার দুটি ভিন্ন পন্থা নিয়ে আলোচনা করা যাক।

সকেট ত্রুটি কি?

সি ভাষার সকেট ত্রুটিগুলি প্রধানত নেতিবাচক রিটার্ন মান বা নির্দিষ্ট ত্রুটি কোড দ্বারা চিহ্নিত করা হয় যা সকেট ফাংশন দ্বারা ফেরত দেওয়া হয়। এই ত্রুটি কোডগুলি ত্রুটির প্রকৃতি সম্পর্কে মূল্যবান তথ্য প্রদান করে এবং আমাদের সনাক্ত করতে এবং সমস্যাগুলি সমাধান করতে সহায়তা করে৷ যদি সকেট ফাংশন একটি নেতিবাচক মান প্রদান করে, এর মানে হল যে কিছু ত্রুটি কার্যকর করার সময় এসেছে। উদাহরণস্বরূপ, যদি "সকেট()" ফাংশন একটি সকেট তৈরি করতে ব্যর্থ হয়, এটি ব্যর্থতা নির্দেশ করতে একটি নেতিবাচক মান ফেরত দিতে পারে। আমরা সহজেই এই ধরনের ত্রুটি সনাক্ত করতে এবং এটি পরীক্ষা করে প্রতিক্রিয়া জানাতে পারি৷

নেতিবাচক রিটার্ন মান ছাড়াও, সকেট ফাংশন "errno" ভেরিয়েবল সেট করে যা একটি গ্লোবাল ভেরিয়েবল যা সাম্প্রতিকতম সিস্টেম বা লাইব্রেরি ফাংশন কলের সাথে সম্পর্কিত নির্দিষ্ট ত্রুটি কোড সংরক্ষণ করে। “errno” ভেরিয়েবলটি “” হেডার ফাইল ব্যবহার করে অ্যাক্সেস করা যেতে পারে এবং এতে পূর্বনির্ধারিত ত্রুটি কোড রয়েছে যা ত্রুটির কারণ সম্পর্কে অতিরিক্ত তথ্য শেয়ার করে।  রিটার্ন মান এবং ত্রুটি কোডের তাৎপর্য বোঝার মাধ্যমে, আমরা ত্রুটির উত্স সনাক্ত করতে এবং যথাযথ ব্যবস্থা নিতে পারি৷

প্রোগ্রামিং উদাহরণ 1:স্ট্ররর ব্যবহার করে সকেট ত্রুটিগুলি ধরুন()
ফাংশন

# অন্তর্ভুক্ত করুন
# অন্তর্ভুক্ত করুন
#include
#include
#include
#include
int প্রধান ()
{
    int socketDescriptor;
    struct sockaddr_in serverAddress;
    // একটি সকেট তৈরি করুন
    socketDescriptor =সকেট (AF_INET, SOCK_STREAM, 0);
    যদি (সকেট ডিসক্রিপ্টর <0)
{
        pererror ("সকেট তৈরি ব্যর্থ হয়েছে");
        প্রস্থান (EXIT_FAILURE);
   

    // সার্ভার ঠিকানা সেট আপ করুন
    serverAddress.sin_family =AF_INET;
    // আসুন একটি উদাহরণ পোর্ট নম্বর ব্যবহার করি
    serverAddress.sin_port =htons (7070);
    // স্থানীয় আইপি ঠিকানা
    serverAddress.sin_addr.s_addr =inet_addr ("127.0.0.1");
    // সার্ভারের সাথে সংযোগ করুন
    যদি (কানেক্ট করুন (সকেটডিসক্রিপ্টর, (স্ট্রাকট সক্যাডর *) এবং সার্ভার অ্যাড্রেস, সাইজফ (সার্ভার অ্যাড্রেস)) <0)
{
        pererror ("সংযোগ ব্যর্থ হয়েছে");
        প্রস্থান (EXIT_FAILURE);
    }
    // ডেটা পাঠান এবং গ্রহণ করুন
 
    // আসুন সকেট বন্ধ করি
    বন্ধ (সকেট ডিসক্রিপ্টর);

    রিটার্ন 0;

আউটপুট:

$gcc err.c -o err
$ ./err
সংযোগ ব্যর্থ হয়েছে:সংযোগ অস্বীকার করা হয়েছে

ব্যাখ্যা:

এই প্রোগ্রামিং উদাহরণে, আমরা একটি সকেট তৈরি করতে socket() ফাংশন ব্যবহার করি। যদি প্রত্যাবর্তিত সকেট বর্ণনাকারী 0 এর কম হয়, যা সকেট তৈরির সময় একটি ত্রুটি নির্দেশ করে, এটি সংশ্লিষ্ট ত্রুটি বার্তা প্রদর্শন করতে "perror()" ফাংশন ব্যবহার করে এবং এটি প্রোগ্রাম থেকে প্রস্থান করে। একটি সংযোগ স্থাপনের জন্য, এটি সার্ভারের ঠিকানা সেট আপ করে এবং সংযোগ () ফাংশন ব্যবহার করে সংযোগ করার চেষ্টা করে যে রিটার্ন মান 0-এর কম কিনা তা পরীক্ষা করে। সংযোগ ব্যর্থ হলে, একটি ত্রুটি বার্তা প্রদর্শন করতে "perror()" ফাংশনটি আবার ব্যবহার করা হয় এবং প্রোগ্রামটি প্রস্থান করবে। এই পদ্ধতির সাহায্যে, আমরা সহজে সি ভাষায় সকেট ত্রুটিগুলি ধরতে পারি। এটি আমাদের তথ্যপূর্ণ ত্রুটি বার্তাগুলি দেখাতে এবং সঠিকভাবে প্রোগ্রামটি বন্ধ করার অনুমতি দেয়৷

প্রোগ্রামিং উদাহরণ 2:Perror() ফাংশন ব্যবহার করে সকেট ত্রুটিগুলি ধরুন

# অন্তর্ভুক্ত করুন
# অন্তর্ভুক্ত করুন
#include
#include
#include
#include
# অন্তর্ভুক্ত
#include
int প্রধান ()
{
    int socketDescriptor;
    struct sockaddr_in serverAddress;

    // একটি সকেট তৈরি করুন
    socketDescriptor =সকেট (AF_INET, SOCK_STREAM, 0);
    যদি (সকেট ডিসক্রিপ্টর <0)
    {
        fprintf (stderr, "সকেট তৈরি করতে ব্যর্থ হয়েছে:%s \n", strerror (errno));
       
        প্রস্থান (EXIT_FAILURE);
   

    // সার্ভার ঠিকানা সেট আপ করুন
    serverAddress.sin_family =AF_INET;
    // আসুন একটি উদাহরণ পোর্ট নম্বর ব্যবহার করি
    serverAddress.sin_port =htons (7070);
    // স্থানীয় আইপি ঠিকানা
    serverAddress.sin_addr.s_addr =inet_addr ("127.0.0.1");
    // এখন আমরা সার্ভার সংযোগের জন্য চেষ্টা করি
    যদি (সংযুক্ত করুন (সকেটডিসক্রিপ্টর, (স্ট্রাকট সক্যাডর *) এবং সার্ভারএড্রেস, সাইজফ (সার্ভারএড্রেস) <0) {
        fprintf (stderr, "সংযোগ করতে ব্যর্থ হয়েছে:%s\n", স্ট্ররর (ত্রুটি));
        প্রস্থান (EXIT_FAILURE);
   

    // ডেটা পাঠান এবং গ্রহণ করুন
    // সকেট বন্ধ করুন
    যদি (বন্ধ (সকেট ডিসক্রিপ্টর) <0)
    {
        fprintf (stderr, "সকেট বন্ধ করা ব্যর্থ হয়েছে:%s\n", strerror (errno));
        প্রস্থান (EXIT_FAILURE);
    }
    printf ("সকেট সফলভাবে বন্ধ।\n");
    রিটার্ন 0;

আউটপুট:

$ gcc error.c -o ত্রুটি
$./ত্রুটি
সংযোগ করতে ব্যর্থ হয়েছে:সংযোগ অস্বীকার করা হয়েছে

ব্যাখ্যা:

এই প্রোগ্রামিং উদাহরণে, আমরা "strerror()" ফাংশন ব্যবহার করে C-তে সকেট ত্রুটিগুলি ধরি। এই ফাংশনটি আমাদের "errno" ভেরিয়েবলে সংরক্ষিত ত্রুটি কোডটিকে মানব-পাঠযোগ্য ত্রুটি বার্তায় রূপান্তর করতে দেয়। "" হেডার ফাইলটি অন্তর্ভুক্ত করে, আমরা "strerror()" ফাংশনটি অ্যাক্সেস করতে পারি এবং সংশ্লিষ্ট ত্রুটি বার্তা পেতে এটিকে "errno" মান প্রদান করতে পারি। এখানে এই প্রোগ্রামে, একটি সকেট তৈরি করার পরে, আমরা পরীক্ষা করি যে সকেট বর্ণনাকারী 0-এর কম যার মানে ব্যর্থতা। যদি একটি ত্রুটি ঘটে, আমরা একটি ত্রুটি বার্তা পুনরুদ্ধার করতে "errno" মান সহ "strerror()" ফাংশন ব্যবহার করি। "fprintf()" ফাংশন স্ট্যান্ডার্ড এরর স্ট্রীমে ত্রুটি বার্তা প্রদর্শন করে। অবশেষে, প্রোগ্রামটি একটি ব্যর্থতার সাথে প্রস্থান করে।

উপসংহার

সকেট ফাংশন দ্বারা প্রদত্ত রিটার্ন মান এবং এরর কোডগুলি বোঝার মাধ্যমে, আমরা সহজেই C-তে এই সকেট ত্রুটিগুলি ধরতে এবং পরিচালনা করতে পারি। প্রথম প্রোগ্রামিং উদাহরণে, আমরা ব্যাখ্যা করেছি কিভাবে ত্রুটি ধরতে হয় এবং "perror()" ফাংশন ব্যবহার করে মান ফেরত দিতে হয়। দ্বিতীয় উদাহরণে, আমরা বিস্তারিত ত্রুটির বার্তা পেতে “strerror()” ফাংশন ব্যাখ্যা করেছি। এই পদ্ধতিগুলি বোঝার মাধ্যমে, আমরা তথ্যমূলক ত্রুটি বার্তাগুলি প্রদর্শন করতে পারি এবং সকেট প্রোগ্রামিং-এ আমাদের প্রোগ্রামগুলি সঠিকভাবে বন্ধ করতে পারি৷

লেখক সম্পর্কে

সি-তে সকেট ত্রুটি সনাক্ত করা:একটি ব্যবহারিক গাইড

বামদেব ঘোষ

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


  1. C++ এ পুনরাবৃত্তিমূলক পদ্ধতি ব্যবহার করে বাইনারি গাছের সমস্ত লিফ নোড বাম থেকে ডানে মুদ্রণ করুন

  2. Matplotlib-এ LaTeX অক্ষ লেবেলের জন্য বোল্ড ফন্টের ওজন

  3. Matplotlib-এ অক্ষ ছাড়াই 3D বার প্লট করুন

  4. নেটওয়ার্কএক্স / ম্যাটপ্লটলিব গ্রাফ অঙ্কনের বৈশিষ্ট্যগুলি কীভাবে পরিবর্তন করবেন?