いっしょにtalk C栗(第百五十四回:C言語例--socket通信アドレスシステム呼び出し二)


皆さん、こんにちは、前回はsocket通信アドレスシステム呼び出しの例を話しましたが、今回はこの例を続けます.余談はさておき,話は本筋に戻る.一緒にtalk C栗を食べましょう!
役人たちは、前回紹介した通信アドレスシステム呼び出しでデータストレージ方式の問題を効果的に解決しましたが、もう一つのシステム呼び出しでもこの問題を解決することができます.今回は、このシステム呼び出し:getaddrinfoを紹介します.
関数プロトタイプ
このシステム呼び出しは,その名前から見てアドレスを取得するための情報であり,ここでのアドレスは主にソケット通信アドレスを指す.取得したアドレス情報はバイト順変換を必要とせず,ソケット通信に直接利用できる.ただし、名前だけを見て結論を下すことはできません.ソケットアドレス情報のほかに、ソケットのプロパティ(ドメイン、タイプ、プロトコル)や通信に関連する他の情報を取得することもできます.次は、システムが呼び出す関数のプロトタイプです.
      int getaddrinfo(const char *node, const char *service,
                       const struct addrinfo *hints,
                       struct addrinfo **res);

この関数を説明する前に、struct addrinfoという関数で使用されるタイプについて説明します.その定義は以下の通りです.
  struct addrinfo {
               int              ai_flags;
               int              ai_family;
               int              ai_socktype;
               int              ai_protocol;
               socklen_t        ai_addrlen;
               struct sockaddr *ai_addr;
               char            *ai_canonname;
               struct addrinfo *ai_next;
           };

このタイプは、8つのメンバーを持つ構造体タイプに属します.これらのメンバーを順に説明します.
  • メンバーai_flagsはgetaddrinfoの動作を制御するために使用され、主にgetaddrinfo関数のhintsパラメータに使用される.
  • メンバーai_familyはソケットのドメインを表す.
  • メンバーai_socktypeはソケットのタイプを表す.
  • メンバーai_protocolはソケット通信時に使用されるプロトコルを表す.
  • メンバーai_addrlenはソケットアドレスの長さを表す.
  • メンバーai_addrはソケットのアドレスを指すポインタです.
  • メンバーai_canonnameは、ローカルホストの名前を指すポインタです.
  • メンバーai_nextは、チェーンテーブルを指し、チェーンテーブルに他のソケットアドレス情報が格納されているポインタである.

  • 皆さんは、これらのメンバーの一部が少し見覚えのある感じではないかと気づきましたか?例えば、メンバーai_familyは,前述の章で説明したソケットシステム呼び出し時のfamilyと同じ意味を表す.実は、ai以外はflags,ai_canonnameとai_nextの3つのメンバーのほか、他のいくつかのメンバーが表す意味は、前の章で説明したソケットシステム呼び出しの場合と全く同じです.私たちはこの3人の新しいメンバーが表している意味を知るだけでいいです.
    関数の使い方
    次に、関数:getaddrinfoの使用方法について説明します.
  • この関数は、最初の2つのパラメータを介してデータを入力し、その後、データを処理し、入力データが処理された後、4番目のパラメータを介してデータを出力する.
  • その3番目のパラメータは、データを出力する際にテンプレートのフォーマットに基づいて出力するテンプレートと見なすことができる.
  • この関数の最初のパラメータはcharタイプのポインタであり、入力されたホスト名またはIPアドレスを格納するために使用される.
  • この関数の2番目のパラメータはcharタイプのポインタであり、入力されたサーバ名またはポート番号を格納するために使用される.
  • この関数の3番目のパラメータはaddrinfoタイプのポインタであり、出力データのフォーマットを制御するために使用され、後述する.
  • この関数の4番目のパラメータはaddrinfoタイプの2次ポインタであり、関数出力のデータを格納するために使用され、後述する.
  • この関数の実行に成功した場合は0を返し、実行に失敗した場合は0以外の値を返し、異なる値は異なるタイプのエラーを表す.

  • この関数は比較的面倒で、面倒性が主に現れるパラメータで、最後の2つのパラメータの使い方を詳しく紹介します.
  • の3番目のパラメータは、構造体タイプの最初の4つのメンバーのみを使用し、他のメンバーは0または空のポインタに設定できます.次に、パラメータ内の各メンバーの値セットとその値の意味について説明します.
  • ai_flagsは関数を制御する機能で、よくAI_を使います.ADDRCONFIGは、自機に戻るIPアドレスを示す値を付与する.他にも値がありますが、一つ一つ列挙しません.getaddrinfoのマニュアルを自分で調べてみてください.(クエリーコマンド:mangetaddrinfo)
  • ai_ファミリーは、リターンアドレス情報におけるソケットを制御するドメインであり、ソケットのドメインがソケットのアドレス構造を決定することをよく知っているので、本質的にはリターンデータにおけるソケットのアドレス構造、すなわちメンバーai_を制御するaddrの構造.その値はAF_INET(IPV 4タイプ)、AF_INET 6(IPV 6タイプ)、およびAF_UNSPECのいずれかであり、AF_UNSPECはすべてのソケットドメインを表す.
  • ai_socktypeは、SOCK_の値を持つデータ内のソケットのタイプを返すために使用されます.STREAM,SOCK_DGRAMおよび0のいずれか.値が0の場合は、すべてのタイプのソケットが返されます.ai_protocolは、データ内のソケットを返すプロトコルを制御するために使用され、デフォルトのプロトコルを使用することを示す0を使用することが多い.

  • の4番目のパラメータでは、構造体メンバーの1番目のメンバーが使用されていないことを除いて、他のメンバーには対応する値があります.これらの値は関数の実行結果であり、各メンバーの値の意味は、addrinfo構造タイプを紹介する際に説明したので、ここでは説明しません.最後のメンバーについて重点的に説明します.
  • 関数が返すデータの中にソケットアドレスが1つしかない場合、その値は空のポインタである.
  • 関数が返すデータの中に2つ以上のソケットアドレスがある場合、それは1つのチェーンテーブルを指す.
  • このチェーンテーブルには、重点コンテンツのすべてのソケットアドレスが格納されている.
  • このポインタはチェーンテーブルのリンクポインタであり、チェーンテーブルはこのポインタによってチェーンテーブルのメンバーを接続する.
  • さっき言ったソケットアドレスチェーンテーブルは関数が動的に生成され、一定のメモリ空間を占有します.これらのソケットアドレスを使用した後、チェーンテーブルが占有するメモリ空間を手動で解放する必要があります.解放時にfreeaddrinfo()関数を使用すればいいです.以下は関数の原型です.
  •  void      freeaddrinfo(struct addrinfo *res);

    この関数を使用する場合は、getaddrinfo関数の最後のパラメータを渡すだけで、パラメータのソケットアドレスチェーンテーブルに使用されるメモリ領域を自動的に解放します.
    お役人さんたちは、これまで私たちが紹介してきた関数の中でgetaddrinfo関数は比較的使いにくい関数ですが、この章回の紹介を通じて、この関数の使い方をマスターしたと信じています.毛おじいさんの詩を引用すると、本当に雄関漫道は鉄のようですね.
    皆さん、socket通信アドレスシステム呼び出しの例についてお話しします.後に何か例があるか知りたいので、次の分解を聞いてください.