研究ノートのgethostbyname関数

この記事のアドレス:http//www.cnblogs.com/wunaozai/p/3753415.html 

コンピュータホストは通常​​、直感的に読み取れる名前を採用していることがわかりました。たとえば、ブログガーデンでは42.121.252.58ではなくwww.cnblogs.comを覚えています。ほとんどのアプリケーションでは、アドレスではなく名前を扱う必要があります。ドット付き10進数で覚えやすい場合、IPv6を使用する場合、IPアドレスはそれほど覚えにくいです。

  以下では、ホスト名を見つけるための最も基本的な関数であるLinuxでの関数gethostbynameを紹介します。呼び出しが成功すると、検索対象のホストのすべてのIPv4アドレスを含むhostent構造体へのポインターが返されます。この関数の制限は、IPv4アドレスのみを返すことができることです。getaddrinfo関数はIPv4アドレスとIPv6アドレスの両方を処理できますが、これは説明の範囲を超えています。

  関数の定義:

1 #include <netdb.h>
2 struct hostent * gethostbyname(const char * hostname);   //返回:若成功则为非空指针,若出错则为NULL且设置h_errno

 

  ホスト構造は次のとおりです。

1 struct hostent{
2     char *h_name; /*official (canonical ) name of host*/
3     char **h_aliases; /*pointer to array of pointers to alias names*/
4     int h_addrtype; /*host address type:AF_INET*/
5     int h_length; /*length of address: 4*/
6     char **h_addr_list; /*ptr to array of ptrs with IPv4 addrs*/
7 };

  h_nameは公式のホスト名であり、h_aliasesはホストのエイリアスです。h_addrtypeは通常、IPの使用を示すAF_INETです。h_lengthはアドレスの長さを表し、IPv4は4バイトです。最後のh_addr_listは、アドレスに対応するすべてのIPアドレスを表します。(追記:1つのアドレスに対応する複数のIPがあり、通常はロードに使用されます。たとえば、大規模なWebサイトでは、南、北、海外などのさまざまな場所にホストが存在する場合があります。IPSが異なればIPも異なります。要するに、多くの状況があります。.複数のIPが必要です)。

  gethostbynameを呼び出して、返された情報を表示する簡単な例。

 1 #include <stdio.h>
 2 #include <arpa/inet.h>
 3 #include <netdb.h>
 4 
 5 
 6 int main(int argc,char **argv)
 7 {
 8     char *ptr,**pptr;
 9     char str[INET_ADDRSTRLEN];
10     struct hostent *hptr;
11 
12     while(--argc>0)//判断参数的个数是否合法
13     {
14       ptr=*++argv;//取第一个参数及以后
15       if((hptr=gethostbyname(ptr))==NULL)//开始获取
16       {
17           printf("gethostbyname error for host: %s: %s\n",ptr,hstrerror(h_errno));//出错信息,并记录在h_error中
18           continue;
19       }
20       printf("official hostname: %s\n",hptr->h_name);//正式主机名
21 
22       for(pptr=hptr->h_aliases;*pptr!=NULL;pptr++)//遍历所有的主机别名
23           printf("\talias: %s\n",*pptr);
24 
25       switch(hptr->h_addrtype)//判断socket类型
26       {
27           case AF_INET:  //IP类为AF_INET
28             pptr=hptr->h_addr_list; //IP地址数组
29             for(;*pptr!=NULL;pptr++)
30                 printf("\taddress: %s\n",inet_ntop(hptr->h_addrtype,*pptr,str,sizeof(str)));//inet_ntop转换为点分十进制
32             break;
33           default:
34             printf("unknown address type\n");
35             break;
36       }
37     }
38     return 0;
39 }

  gcc hostent.c -ohostentをコンパイルします

  

  サーバー:202.96.134.133は、/ etc /resolv.conf内のローカルDNSです。

おすすめ

転載: blog.csdn.net/xiaolei251990/article/details/84826829