ソケットプログラミング二十から四:のgethostbyname()関数は、ドメイン名を介してIPアドレスを取得します

直接IPアドレスを使用しているクライアントは、IPアドレスの変更(IPアドレスが頻繁に変更される)と、クライアント・ソフトウェア・エラーが発生し、深刻な欠点になります。

ドメイン名は、ソフトウェアの通常の使用には影響しません、決して自身、IPアドレスを交換するためにDNSを変更するドメイン名登録の更新後の今年限り、使用することに非常に簡単になります。

ドメイン名登録、ドメイン名解決、ホストファイル、DNSサーバなどについてここでは、読者が自分の脳を作る、詳細に説明していません。このセクションでは、ドメイン名を使用する方法を説明するに焦点を当てています。

ドメイン名を介してIPアドレスを取得します

ドメイン名は、単にニーモニックIPアドレスで、目的は、覚えやすいですし、あなたが通信する前に、IPアドレスに変換するドメイン名にしたいしなければならない、ドメイン名を介してターゲットコンピュータを見つけることができません。

gethostbyname()関数は、この変換を達成することができ、それはプロトタイプは次のとおりです。


struct hostent *gethostbyname(const char *hostname);

ホスト名は、ドメイン名でホスト名、です。この機能を使用する場合は、限り、ドメイン名の文字列が送信されるように、対応するIPアドレスを返します。リターンアドレス情報は以下のような構造が定義されている、ロードされたhostent構造体です:


struct hostent{
char *h_name; //official name
char **h_aliases; //alias list
int h_addrtype; //host address type
int h_length; //address lenght
char **h_addr_list; //address list
}

構造からわかるように、あなたの読者は、最後のメンバーのh_addr_listに焦点を当てることができ、また、追加情報が付属して、IPアドレスを返さないだけ。以下、各部材について説明します。

  • h_name:公式のドメイン名(公式ドメイン名)。公式ドメインホームの代わりに名前が、実際にはいくつかの有名な会社のドメイン名は、正式ドメイン名で登録されていませんでした。
  • h_aliases:エイリアスは、同じホスト複数のドメイン名を介してアクセスすることができます。同じIPアドレスは、異なるドメイン名を指定することができますので、現在のドメイン名に加えて、複数のドメイン名をバインドすることができます。
  • h_addrtype:()のgethostbynameはIPv4のみをサポートしていますが、また、あなたがこのメンバーはIPv4対応のAF_INET、IPv6の対応AF_INET6を経由してIPアドレスファミリのアドレス(アドレスタイプ)の情報を得ることができ、IPv6をサポートしています。
  • h_length:IPアドレス長を取り揃えています。4の長さは、IPv4、IPv6の、16バイトの長さのバイト。
  • h_addr_list:これは最も重要なメンバーです。メンバーによって整数の対応するIPアドレスを保存します。複数のサーバーのためにユーザーが、同じドメイン名への負荷を分散するために複数のサーバを使用する複数のIPアドレスを割り当てることができます。


hostent構造体変数の組成を以下に示します:

組成hostent構造体


次のコードメインプレゼンテーションのgethostbyname()が適用され、その特性はhostent構造体が記載されています。


#include <stdio.h>
#include <stdlib.h>
#include <WinSock2.h>
#pragma comment(lib, "ws2_32.lib")

int main(){
WSADATA wsaData;
WSAStartup( MAKEWORD(2, 2), &wsaData);

struct hostent *host = gethostbyname("www.baidu.com");
if(!host){
puts("Get IP address error!");
system("pause");
exit(0);
}

//别名
for(int i=0; host->h_aliases[i]; i++){
printf("Aliases %d: %s\n", i+1, host->h_aliases[i]);
}

//地址类型
printf("Address type: %s\n", (host->h_addrtype==AF_INET) ? "AF_INET": "AF_INET6");

//IP地址
for(int i=0; host->h_addr_list[i]; i++){
printf("IP addr %d: %s\n", i+1, inet_ntoa( *(struct in_addr*)host->h_addr_list[i] ) );
}

system("pause");
return 0;
}

業績:
別名1:www.baidu.com
タイプのアドレス:AF_INET
IP ADDR 1:61.135.169.121
IP ADDR 2:61.135.169.125

公開された33元の記事 ウォン称賛30 ビュー20000 +

おすすめ

転載: blog.csdn.net/baidu_15547923/article/details/90230468