[TCP / IP]ネットワークプログラミング:08のドメイン名とネットワークアドレス

Benpian文書は、ドメイン名とIPアドレスとシステムの間の関係を概説します。

ドメインネームシステム

DNS(ドメインネームシステム、ドメインネームシステム)は、IPアドレスとドメイン名の変換システム、DNSサーバのコアです。

ドメイン名は何ですか

サーバーのIPアドレスを介してネットワークサービスの提供も区別されるが、面倒な形式のIPアドレス、IPアドレスの代わりに通常より簡潔なドメイン名。ドメインネームサービス要求を使用してのもう一つの利点は、ドメインネームサーバは、一般的に簡単に変更されないことであるが、そのIPアドレスが頻繁に変更する必要があるかもしれません。

DNSサーバ

Baiduのホームページを閲覧するには、ブラウザ183.232.231.172のBaiduのウェブサイトのアドレスバーにIPアドレスを入力し、私たちは通常、入力することは、www.baidu.comので、より便利にBaiduのドメイン名です。この結果から、二つの方法は、Baiduのホーム・ページに入ることができ、かつ他の違いはありません。ドメイン名は、サーバの仮想アドレスではなく、実際のアドレスに与えられています。そのため、実際のIPアドレスに正常に通信するためにドメイン名を変換する必要は、DNSサーバは、ドメイン名とIPアドレスの間の変換を担当するツールです。

DNSサーバは、仕事は似ているのですか?コンピュータは、通常、デフォルトのDNSサーバを内蔵しているが、すべてのドメイン名とIPアドレスの情報を知ることは不可能です。デフォルトのDNSサーバが解決できない場合は、他のDNSサーバーを聞いてきますし、最終的な結果は、ユーザーにバックアップ。

 DNSサービス要求

デフォルトのDNSサーバは、それらを解決することはできません、それは優れたDNSサーバに要求されますという要求を受信します。要求は、トップレベルのDNSサーバ---ルートDNSサーバーに到達するまでの段階的な方法を通じて、そのDNSサーバは、尋問を下げるかを知っているのと同じ方法、最終的に解決されたIPアドレス情報バックと要求しているホストに送信されます。DNSは、分散データベース・システムが階層管理です。

IPアドレスとドメイン名の間の変換

IPアドレスとドメイン名のニーズとの間の変換は、実際のプログラムを書くことので、一般的にドメイン名を必要とし、対応するIPアドレス情報に変換するIPアドレスの代わりに、より安定したドメイン名に使用されている理由。一見、実際には、冗長運転プログラムの信頼性を考慮し、保護を行います。

ドメイン名を使用してIPアドレスを取得

#include <netdb.h> 構造体たhostentのgethostbyname *(CONST CHAR * ホスト名);
     - > バックhostent構造体ポインタ成功、NULLポインタを返す失敗// hostent構造体が定義されている構造体たhostent 
{ チャー * h_name;         // 正式名称文字 ** h_aliases      // aliaseリストint型 h_addrtype;       // ホストアドレスタイプint型 h_length;         // アドレスlengh のchar ** h_addr_list;   // アドレスリスト 
}

 



    
    
    
    
    

 hostent構造体変数の構造

 h_addr_list構造体メンバ

hostent结构体变量中最重要的或者说我们最关注的成员是h_addr_list,该变量以字符指针数组的形式保存域名对应的IP地址结构(使用char*而非in_addr*是为了兼容性的考虑,其实更为合适的类型是void*,不过当时void*还并未标准化)。之所以会存在多个IP地址,是考虑到大量用户情况下需要利用多个服务器进行负载均衡。gethostbyname函数的示例代码如下。

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <unistd.h>
 4 #include <arpa/inet.h>
 5 #include <netdb.h>
 6 void error_handling(char *message);
 7 
 8 int main(int argc, char *argv[])
 9 {
10     int i;
11     struct hostent *host;
12     if(argc!=2) {
13         printf("Usage : %s <addr>\n", argv[0]);
14         exit(1);
15     }
16     
17     host=gethostbyname(argv[1]);
18     if(!host)
19         error_handling("gethost... error");
20 
21     printf("Official name: %s \n", host->h_name);
22     
23     for(i=0; host->h_aliases[i]; i++)
24         printf("Aliases %d: %s \n", i+1, host->h_aliases[i]);
25     
26     printf("Address type: %s \n", 
27         (host->h_addrtype==AF_INET)?"AF_INET":"AF_INET6");
28 
29     for(i=0; host->h_addr_list[i]; i++)
30         printf("IP addr %d: %s \n", i+1,
31                     inet_ntoa(*(struct in_addr*)host->h_addr_list[i]));
32     return 0;
33 }
34 
35 void error_handling(char *message)
36 {
37     fputs(message, stderr);
38     fputc('\n', stderr);
39     exit(1);
40 }
gethostbyname

运行结果

若输入我们所熟悉的百度域名,则可得到如下结果:

[root@XXX-Linux exercises]# ./ttt www.baidu.com

Official name: www.a.shifen.com 
Aliases 1: www.baidu.com 
Address type: AF_INET 
IP addr 1: 183.232.231.172 
IP addr 2: 183.232.231.174 

利用IP地址获取域名

#include <netdb.h>

struct hostent *gethostbyaddr(const char *addr, socklen_t len, int family);
    -> 成功时返回hostent结构体变量指针,失败时返回NULL指针

通过输入google的IP地址,gethostbyaddr函数的示例代码如下。

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <string.h>
 4 #include <unistd.h>
 5 #include <arpa/inet.h>
 6 #include <netdb.h>
 7 void error_handling(char *message);
 8 
 9 int main(int argc, char *argv[])
10 {
11     int i;
12     struct hostent *host;
13     struct sockaddr_in addr;
14     if(argc!=2) {
15         printf("Usage : %s <IP>\n", argv[0]);
16         exit(1);
17     }
18 
19     memset(&addr, 0, sizeof(addr));
20     addr.sin_addr.s_addr=inet_addr(argv[1]);
21     host=gethostbyaddr((char*)&addr.sin_addr, 4, AF_INET);
22     if(!host)
23         error_handling("gethost... error");
24 
25     printf("Official name: %s \n", host->h_name);
26 
27     for(i=0; host->h_aliases[i]; i++)
28         printf("Aliases %d: %s \n", i+1, host->h_aliases[i]);
29     
30     printf("Address type: %s \n", 
31         (host->h_addrtype==AF_INET)?"AF_INET":"AF_INET6");
32 
33     for(i=0; host->h_addr_list[i]; i++)
34         printf("IP addr %d: %s \n", i+1,
35                     inet_ntoa(*(struct in_addr*)host->h_addr_list[i]));    
36     return 0;
37 }
38 
39 void error_handling(char *message)
40 {
41     fputs(message, stderr);
42     fputc('\n', stderr);
43     exit(1);
44 }
gethostbyaddr

运行结果

おすすめ

転載: www.cnblogs.com/Glory-D/p/12116095.html