UNPv 1第十一章:高級名前とアドレス変換

4793 ワード

1.getaddrinfo
getaddrinfo関数は、名前からアドレス、およびサービスからポートへの2つの変換を処理し、アドレスリストではなくsockaddr構造を返します.これらのsockaddr構造は、ソケット関数によって直接使用できます.
#include <netdb.h>
int getaddrinfo (const char *hostname, const char *service, const struct addrinfo *hints, struct addrinfo **result) ;
//  :    0,    0

hostnameパラメータはホスト名またはアドレス列であり、serviceパラメータはサービス名または10進ポート文字列であり、この関数はresultポインタパラメータによってaddrinfo構造チェーンテーブルへのポインタを返し、addrinfo構造はヘッダファイルに定義される
struct addrinfo {
   int          ai_flags;           /* AI_PASSIVE, AI_CANONNAME */
   int          ai_family;          /* AF_xxx */
   int          ai_socktype;        /* SOCK_xxx */
   int          ai_protocol;        /* 0 or IPPROTO_xxx for IPv4 and IPv6 */
   socklen_t    ai_addrlen;         /* length of ai_addr */
   char        *ai_canonname;       /* ptr to canonical name for host */
   struct sockaddr    *ai_addr;     /* ptr to socket address structure */
   struct addrinfo    *ai_next;     /* ptr to next structure in linked list */
};

同様にgetaddrinfo関数のパラメータhintsもタイプです.hintsパラメータは、空のポインタであってもよいし、addrinfo構造のポインタであってもよい.呼び出し者は、この構造に所望の戻り情報タイプに関するヒントを埋め込むことができる.たとえば、指定されたサービスがTCPとUDPの両方をサポートする場合、呼び出し元はhints構造のai_をsocktypeメンバーをSOCK_に設定DGRAMは、データ・ジャケット・インタフェースに適した情報のみを返す.hints構造で呼び出し元が設定できるメンバーは、次のとおりです.
  • ai_flags(ゼロまたは複数または一緒のAI_xxx値)
  • ai_family(あるAF_xxx値)
  • ai_socktype(SOCK_xxx値)
  • ai_protocol

  • そのうちai_flagsメンバーで使用可能なフラグ値とその意味は、例えばAI_PASIVE(ソケットは受動的に開くために使用されます)、AI_CANONNAME(getaddrinfo関数がホストの仕様名を返すことを知らせる)など、この関数が正常に返された場合、resultパラメータによって指す変数は、ai_を指すポインタに埋め込まれます.nextメンバーが直列に接続されたaddrinfo構造チェーンテーブル.まずhints構造を割り当て、それをクリアして必要なフィールドに記入し、getaddrinfoを呼び出してチェーンテーブルを巡回して各戻りアドレスを試しなければなりません.
    2.freeaddrinfo
    関数getaddrinfoが返すすべてのストレージスペースはfreeaddrinfoを呼び出してシステムに返されます.
    #include <netdb.h>
    void freeaddrinfo (struct addrinfo *ai);

    aiはgetaddrinfoが返す最初のaddrinfo構造を指すべきである.チェーンテーブル内のすべての構造、およびこれらの機構が指す動的記憶空間は解放されます.addrinfo構造のみをコピーし、addrinfo構造が指す他の構造をコピーしないで、浅いコピーまたは浅いコピー(shallow copy)と呼ばれます.addrinfo構造をコピーし、addrinfo構造が指す他の構造をコピーします.これを深コピーまたは深コピー(deep copy)と呼びます.
    3.getnameinfo
    getnameinfo関数はgetaddrinfoと相補的です.インタフェースアドレスをパラメータとして、ホストを記述する文字列とサービスを記述する文字列を返します.この関数はプロトコルとは独立した方法でこれらの情報を提供します.
    #include <netdb.h>
    int getnameinfo (const struct sockaddr *sockaddr, socklen_t addrlen, char *host, socklen_t hostlen, char *serv, socklen_t servlen, int flags) ;
    //   0,    0( gai_strerror     )

    sockaddrは、プロトコルアドレスを含むソケットインタフェースアドレス構造を指し、構造の長さである読み取り可能な文字列に変換される.この構造および長さは、通常、accept、recvfrom、getsockname、getpeernameから返される2つの直感的に読み取り可能な文字列を返し、呼び出し元が記憶領域を予め割り当て、hostおよびhostlenがホスト文字列を指定し、servおよびservlenがサービス文字列を指定する.呼び出し元がホスト文字列またはサービス文字列を返したくない場合は、hostlenまたはservlenを0と指定します.sock_ntopとgetnameinfoの違いは、前者はDNSにかかわらず、出力可能なIPアドレスとポート番号を直接返し、後者は通常ホストとサービスの名前を与えようとすることである.
    4. host_serv関数
    getaddrinfoに設計した最初のインタフェースは、hints構造を割り当てて記入するために呼び出し者を必要としません.このhost_serv関数は、アドレスファミリーとソケットインタフェースタイプをパラメータとして使用します.
    #include "unp.h"
    struct addrinfo * host_serv(const char * hostname, const char * service ,int family, int socktype); 
    //  :      addrinfo     ,    NULL