Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> सी प्रोग्रामिंग

C में सॉकेट त्रुटियों का पता लगाना: एक व्यावहारिक मार्गदर्शिका

परिचय

C में सॉकेट त्रुटियों का पता लगाना: एक व्यावहारिक मार्गदर्शिका

सॉकेट त्रुटियां नेटवर्क संचार में बहुत आम हैं और प्रक्रिया के कई चरणों में उत्पन्न हो सकती हैं जिनमें कनेक्शन स्थापना, डेटा ट्रांसमिशन, और डिस्कनेक्शन शामिल हैं। ये त्रुटियां नेटवर्क विफलताओं, कनेक्शन टाइमआउट, संसाधन सीमाओं, या गलत कॉन्फ़िगरेशन सेटिंग्स जैसे कारकों की एक विस्तृत श्रृंखला के कारण हो सकती हैं।

आइए C प्रोग्रामिंग भाषा में "perror()" और "strerror()" फ़ंक्शन का उपयोग करके सॉकेट त्रुटियों को पकड़ने के दो अलग-अलग दृष्टिकोणों पर चर्चा करें।

सॉकेट त्रुटियां क्या हैं?

C भाषा में सॉकेट त्रुटियों की पहचान मुख्य रूप से सॉकेट फ़ंक्शन द्वारा लौटाए गए नकारात्मक रिटर्न वैल्यू या विशिष्ट त्रुटि कोड द्वारा की जाती है। ये त्रुटि कोड त्रुटि की प्रकृति के बारे में मूल्यवान जानकारी प्रदान करते हैं और हमें समस्याओं का पता लगाने और हल करने में मदद करते हैं। यदि सॉकेट फ़ंक्शन एक नकारात्मक मान लौटाता है, तो इसका मतलब है कि निष्पादन के समय कुछ त्रुटि आई। उदाहरण के लिए, यदि "socket()" फ़ंक्शन सॉकेट बनाने में विफल रहता है, तो यह विफलता को इंगित करने के लिए एक नकारात्मक मान लौटा सकता है। हम इसे जांचकर ऐसी त्रुटियों का आसानी से पता लगा सकते हैं और प्रतिक्रिया दे सकते हैं।

नकारात्मक रिटर्न वैल्यू के अलावा, सॉकेट फ़ंक्शन "errno" वेरिएबल को भी सेट करते हैं जो एक ग्लोबल वेरिएबल है जो सबसे हाल के सिस्टम या लाइब्रेरी फ़ंक्शन कॉल से जुड़े विशिष्ट त्रुटि कोड को संग्रहीत करता है। "errno" वेरिएबल को "<errno.h>" हेडर फ़ाइल का उपयोग करके एक्सेस किया जा सकता है और इसमें पूर्वनिर्धारित त्रुटि कोड होते हैं जो त्रुटि के कारण के बारे में अतिरिक्त जानकारी साझा करते हैं। रिटर्न वैल्यू और त्रुटि कोड के महत्व को समझकर, हम त्रुटि के स्रोत की पहचान कर सकते हैं और उचित कार्रवाई कर सकते हैं।

प्रोग्रामिंग उदाहरण 1: 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;

    // एक सॉकेट बनाएं
    socketDescriptor = socket(AF_INET, SOCK_STREAM, 0);
    if (socketDescriptor < 0) {
        perror("सॉकेट निर्माण विफल");
        exit(EXIT_FAILURE);
    }

    // सर्वर पता सेट करें
    serverAddress.sin_family = AF_INET;
    // उदाहरण पोर्ट नंबर का उपयोग करें
    serverAddress.sin_port = htons(7070);
    // लोकल IP पता
    serverAddress.sin_addr.s_addr = inet_addr("127.0.0.1");

    // सर्वर से कनेक्ट करें
    if (connect(socketDescriptor, (struct sockaddr*)&serverAddress, sizeof(serverAddress)) < 0) {
        perror("कनेक्शन विफल");
        exit(EXIT_FAILURE);
    }

    // डेटा भेजें और प्राप्त करें

    // सॉकेट बंद करें
    close(socketDescriptor);

    return 0;
}

आउटपुट

$ gcc err.c -o err
$ ./err
कनेक्शन विफल: कनेक्शन अस्वीकृत

व्याख्या:

इस प्रोग्रामिंग उदाहरण में, हम सॉकेट बनाने के लिए socket() फ़ंक्शन का उपयोग करते हैं। यदि लौटाया गया सॉकेट डिस्क्रिप्टर 0 से कम है, जो सॉकेट निर्माण के दौरान त्रुटि को इंगित करता है, तो यह संबंधित त्रुटि संदेश प्रदर्शित करने के लिए "perror()" फ़ंक्शन का उपयोग करता है और प्रोग्राम से बाहर निकलता है। कनेक्शन स्थापित करने के लिए, यह सर्वर पता सेट करता है और connect() फ़ंक्शन का उपयोग करके कनेक्ट करने का प्रयास करता है यह जांचने के लिए कि रिटर्न वैल्यू 0 से कम है या नहीं। कनेक्शन विफलता के मामले में, त्रुटि संदेश प्रदर्शित करने के लिए "perror()" फ़ंक्शन का फिर से उपयोग किया जाता है और प्रोग्राम बाहर निकल जाएगा। इस दृष्टिकोण के साथ, हम C भाषा में सॉकेट त्रुटियों को आसानी से पकड़ सकते हैं। यह हमें सूचनात्मक त्रुटि संदेश दिखाने और प्रोग्राम को उचित तरीके से समाप्त करने की अनुमति देता है।

प्रोग्रामिंग उदाहरण 2: 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;

    // एक सॉकेट बनाएं
    socketDescriptor = socket(AF_INET, SOCK_STREAM, 0);
    if (socketDescriptor < 0) {
        fprintf(stderr, "सॉकेट बनाने में विफल: %s \n", strerror(errno));
        exit(EXIT_FAILURE);
    }

    // सर्वर पता सेट करें
    serverAddress.sin_family = AF_INET;
    // उदाहरण पोर्ट नंबर का उपयोग करें
    serverAddress.sin_port = htons(7070);
    // लोकल IP पता
    serverAddress.sin_addr.s_addr = inet_addr("127.0.0.1");

    // अब सर्वर कनेक्शन का प्रयास करें
    if (connect(socketDescriptor, (struct sockaddr*)&serverAddress, sizeof(serverAddress)) < 0) {
        fprintf(stderr, "कनेक्ट करने में विफल: %s\n", strerror(errno));
        exit(EXIT_FAILURE);
    }

    // डेटा भेजें और प्राप्त करें
    // सॉकेट बंद करें
    if (close(socketDescriptor) < 0) {
        fprintf(stderr, "सॉकेट बंद करने में विफल: %s\n", strerror(errno));
        exit(EXIT_FAILURE);
    }
    printf("सॉकेट सफलतापूर्वक बंद।\n");
    return 0;
}

आउटपुट

$ gcc error.c -o error
$ ./error
कनेक्ट करने में विफल: कनेक्शन अस्वीकृत

व्याख्या:

इस प्रोग्रामिंग उदाहरण में, हम C में "strerror()" फ़ंक्शन का उपयोग करके सॉकेट त्रुटियों को पकड़ते हैं। यह फ़ंक्शन हमें "errno" वेरिएबल में संग्रहीत त्रुटि कोड को मानव-पठनीय त्रुटि संदेश में बदलने की अनुमति देता है। "<string.h>" हेडर फ़ाइल को शामिल करके, हम "strerror()" फ़ंक्शन तक पहुंच सकते हैं और इसे संबंधित त्रुटि संदेश प्राप्त करने के लिए "errno" मान प्रदान कर सकते हैं। यहां इस प्रोग्राम में, सॉकेट बनाने के बाद, हम जांचते हैं कि सॉकेट डिस्क्रिप्टर 0 से कम है या नहीं जिसका अर्थ विफलता है। यदि कोई त्रुटि होती है, तो हम "errno" मान के साथ "strerror()" फ़ंक्शन का उपयोग करके एक त्रुटि संदेश पुनर्प्राप्त करते हैं। "fprintf()" फ़ंक्शन मानक त्रुटि स्ट्रीम पर त्रुटि संदेश प्रदर्शित करता है। अंत में, प्रोग्राम विफलता स्थिति के साथ बाहर निकलता है।

निष्कर्ष

सॉकेट फ़ंक्शन द्वारा प्रदान किए गए रिटर्न वैल्यू और त्रुटि कोड को समझकर, हम C में इन सॉकेट त्रुटियों को आसानी से पकड़ और संभाल सकते हैं। पहले प्रोग्रामिंग उदाहरण में, हमने बताया कि "perror()" फ़ंक्शन का उपयोग करके त्रुटि और रिटर्न वैल्यू को कैसे पकड़ा जाए। दूसरे उदाहरण में, हमने विस्तृत त्रुटि संदेश प्राप्त करने के लिए "strerror()" फ़ंक्शन की व्याख्या की। इन विधियों को समझकर, हम सॉकेट प्रोग्रामिंग में सूचनात्मक त्रुटि संदेश प्रदर्शित कर सकते हैं और अपने प्रोग्राम को उचित तरीके से समाप्त कर सकते हैं।

लेखक के बारे में

C में सॉकेट त्रुटियों का पता लगाना: एक व्यावहारिक मार्गदर्शिका

बामदेब घोष

बामदेब घोष को वायरलेस नेटवर्किंग डोमेन में व्यावहारिक अनुभव है। वह वायरलेस या वायर्ड नेटवर्किंग पर वायरशार्क कैप्चर विश्लेषण के विशेषज्ञ हैं, साथ ही एंड्रॉइड, ब्लूटूथ, लिनक्स कमांड और पायथन का ज्ञान रखते हैं। उनकी साइट फॉलो करें: wifisharks.com

  1. Android में पिछली Activity पर वापस जाने से कैसे रोकें? Android में पिछली Activity पर वापस जाने से कैसे रोकें?

    ऐसी कई स्थितियां होती हैं जहां हमें बैक बटन दबाने पर वापस जाने की कार्रवाई नहीं करनी चाहिए। बैक बटन एक्शन को अक्षम करने का उदाहरण चरण 1 - नया प्रोजेक्ट बनाएं Android Studio में एक नया प्रोजेक्ट बनाएं: File → New Project पर जाएं और आवश्यक विवरण भरें। चरण 2 - लेआउट XML में कोड जोड़ें res/layout/act

  1. Matplotlib के साथ numpy datetime64 प्लॉट करें Matplotlib के साथ numpy datetime64 प्लॉट करें

    Python में matplotlib का उपयोग करके टाइम सीरीज़ प्लॉट करने के लिए, हम निम्नलिखित चरण अपना सकते हैं: NumPy का उपयोग करके x और y पॉइंट्स बनाएं। plot() मेथड का उपयोग करके बनाए गए x और y पॉइंट्स प्लॉट करें। फिगर डिस्प्ले करने के लिए show() मेथड का उपयोग करें। उदाहरण import matplotlib.pyplot as p

  1. मैटप्लॉटलीब में लीजेंड मार्कर साइज़ और अल्फा कैसे सेट करें? मैटप्लॉटलीब में लीजेंड मार्कर साइज़ और अल्फा कैसे सेट करें?

    मैटप्लॉटलीब में लीजेंड मार्कर साइज़ और अल्फा सेट करने के लिए, हम निम्नलिखित चरण अपना सकते हैं: चरण फिगर साइज़ सेट करें और सबप्लॉट्स के बीच और आसपास पैडिंग एडजस्ट करें। सैंपल डेटा की संख्या स्टोर करने के लिए N वेरिएबल इनिशियलाइज़ करें। marker=* के साथ x और y डेटा पॉइंट्स प्लॉट करें। फिगर पर लीजेंड