Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

C でのソケット エラーの検出:実践ガイド

C でのソケット エラーの検出:実践ガイド

ソケット エラーはネットワーク通信で非常に一般的に発生し、接続の確立、データ送信、切断などのプロセスのさまざまな段階で発生する可能性があります。これらのエラーは、ネットワーク障害、接続タイムアウト、リソース制限、構成設定の誤りなど、さまざまな要因によって発生する可能性があります。

「perror()」関数と「strerror()」関数を使用して、C プログラミング言語でソケット エラーを捕捉する 2 つの異なるアプローチについて説明します。

ソケット エラーとは何ですか?

C 言語のソケット エラーは、主にソケット関数によって返される負の戻り値または特定のエラー コードによって識別されます。これらのエラー コードは、エラーの性質に関する貴重な情報を提供し、問題の検出と解決に役立ちます。ソケット関数が負の値を返した場合は、実行時に何らかのエラーが発生したことを意味します。たとえば、「socket()」関数がソケットの作成に失敗した場合、失敗を示すために負の値が返されることがあります。これをチェックすることで、そのようなエラーを簡単に検出して対応できます。

ソケット関数は、負の戻り値に加えて、最新のシステムまたはライブラリ関数呼び出しに関連付けられた特定のエラー コードを格納するグローバル変数である「errno」変数も設定します。 「errno」変数には「」ヘッダー ファイルを使用してアクセスでき、エラーの理由に関する追加情報を共有する事前定義されたエラー コードが含まれています。  戻り値とエラー コードの重要性を理解することで、エラーの原因を特定し、適切な措置を講じることができます。

プログラミング例 1:Strerror() を使用してソケット エラーを捕捉する
機能

#include
#include
#include
#include
#include
#include
intメイン()
{
    int ソケット記述子;
    struct sockaddr_in サーバーアドレス;
    // ソケットを作成します
    ソケット記述子 =ソケット (AF_INET、SOCK_STREAM、0);
    if (socketDescriptor <0)
{
        perror (「ソケットの作成に失敗しました」);
        終了(EXIT_FAILURE);
    }

    // サーバーアドレスを設定します
    サーバーアドレス.sin_family =AF_INET;
    // ポート番号の例を使用してみましょう
    サーバーアドレス.sin_port =htons (7070);
    // ローカルIPアドレス
    serverAddress.sin_addr.s_addr =inet_addr ("127.0.0.1");
    // サーバーに接続します
    if (connect (socketDescriptor, (struct sockaddr * ) &サーバーアドレス, sizeof (サーバーアドレス)) <0)
{
        perror (「接続に失敗しました」);
        終了 (EXIT_FAILURE);
    }
    // データの送受信
 
    // ソケットを閉じましょう
    close (socketDescriptor);

    0を返します。
}

出力:

$ gcc err.c -o err
$ ./エラー
接続失敗:接続が拒否されました

説明:

このプログラミング例では、socket() 関数を使用してソケットを作成します。返されたソケット記述子が 0 未満の場合は、ソケット作成時のエラーを示し、「perror()」関数を使用して対応するエラー メッセージを表示し、プログラムを終了します。接続を確立するには、サーバー アドレスを設定し、connect() 関数を使用して接続を試行し、戻り値が 0 より小さいかどうかを確認します。接続に失敗した場合は、「perror()」関数が再度使用されてエラー メッセージが表示され、プログラムが終了します。このアプローチを使用すると、C 言語のソケット エラーを簡単に検出できます。これにより、有益なエラー メッセージを表示し、プログラムを適切に終了できるようになります。

プログラミング例 2:Perror() 関数を使用してソケット エラーを捕捉する

#include
#include
#include
#include <文字列.h>
#include
#include
#include
#include
intメイン()
{
    int ソケット記述子;
    struct sockaddr_in サーバーアドレス;

    // ソケットを作成します
    ソケット記述子 =ソケット (AF_INET、SOCK_STREAM、0);
    if (socketDescriptor <0)
    {
        fprintf (stderr, "ソケットの作成に失敗しました:%s \n", strerror (errno));
       
        終了 (EXIT_FAILURE);
    }

    // サーバーアドレスを設定します
    サーバーアドレス.sin_family =AF_INET;
    // ポート番号の例を使用してみましょう
    サーバーアドレス.sin_port =htons (7070);
    // ローカルIPアドレス
    serverAddress.sin_addr.s_addr =inet_addr ("127.0.0.1");
    // 次にサーバー接続を試みます
    if (connect (socketDescriptor, (struct sockaddr *) &サーバーアドレス, sizeof (サーバーアドレス)) <0) {
        fprintf (stderr, "接続に失敗しました:%s\n", strerror (errno));
        終了 (EXIT_FAILURE);
    }

    // データの送受信
    // ソケットを閉じる
    if (close (socketDescriptor) <0)
    {
        fprintf (stderr, "ソケットの閉鎖に失敗しました:%s\n", strerror (errno));
        終了 (EXIT_FAILURE);
    }
    printf ("ソケットは正常に閉じられました。\n");
    0を返します。
}

出力:

$ gcc エラー.c -o エラー
$ ./エラー
接続に失敗しました:接続が拒否されました

説明:

このプログラミング例では、「strerror()」関数を使用して C のソケット エラーを捕捉します。この関数を使用すると、「errno」変数に保存されているエラー コードを人間が判読できるエラー メッセージに変換できます。 「」ヘッダー ファイルをインクルードすることで、「strerror()」関数にアクセスし、それに「errno」値を指定して、対応するエラー メッセージを取得できます。このプログラムでは、ソケットを作成した後、ソケット記述子が失敗を意味する 0 未満であるかどうかを確認します。エラーが発生した場合は、「strerror()」関数と「errno」値を使用してエラー メッセージを取得します。 「fprintf()」関数は、標準エラー ストリームにエラー メッセージを表示します。最後に、プログラムは失敗ステータスで終了します。

結論

ソケット関数によって提供される戻り値とエラー コードを理解することで、C でこれらのソケット エラーを簡単にキャッチして処理することができます。最初のプログラミング例では、「perror()」関数を使用してエラーと戻り値をキャッチする方法を説明しました。 2 番目の例では、詳細なエラー メッセージを取得する「strerror()」関数について説明しました。これらのメソッドを理解することで、ソケット プログラミングで有益なエラー メッセージを表示し、プログラムを適切に終了できます。

著者について

C でのソケット エラーの検出:実践ガイド

バンデブ ゴーシュ

Bamdeb Ghosh は、ワイヤレス ネットワーキング ドメインでの実践経験を持っています。彼は、Android、Bluetooth、Linux コマンド、Python の知識に加え、ワイヤレスまたは有線ネットワーキングにおける Wireshark キャプチャ分析の専門家です。彼のサイトをフォローしてください:wifisharks.com


  1. 長方形の面積と周囲長のためのCプログラム

    長方形の長さと幅を考えると、その面積と周囲長を見つける必要があります。 長方形は、4つの辺とそれぞれ90度の4つの角度を含む2D図形です。長方形のすべての辺が等しいわけではなく、長方形の反対側だけが等しいだけです。長方形の対角線も同じ長さです。 以下は長方形の図式表現です。 ここで、Aは長方形の幅を表し、Bは長方形の長さを表します。 エリアを見つけるには 長方形の式は次のとおりです。長さx幅 また、長方形の周囲長は− 2 x(長さ+幅) 。 例 Input: 20 30 Output: area of rectangle is : 600    peri

  2. C で read() システム コールをマスターする:総合ガイド

    C 言語には、ファイルを読み取ることができる関数がいくつかあります。最も一般的に使用されるのは、read() 関数と fread() 関数です。この言語は、getchar() などの関数を使用して 1 文字ずつ読み取るメソッドも提供します。 ファイル処理関数、その呼び出しメソッド、入出力引数などをスムーズに使用するためには、ファイル処理関数を理解しておくことが重要です。これらは、プログラマーがシステムに保存されている情報を保存したり破棄したりするために利用できるリソースであるためです。 この Linuxhint 記事では、read() 関数を使用してファイルを読み取る方法を学習します。