この記事のアドレス: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です。