C言語-ソケットプログラミング_ホスト名からIPアドレスを得る
gethostbyname()関数
ホスト名からIPアドレスを得るにはgethostbyname()関数を利用します。
gethostbyname()はDNSに問い合わせて正引き(ホスト名に対応するIPアドレスを調べる)を行います。
また、ローカルのホストファイル(/etc/hostsなど)にアドレスが登録してある場合には、そこから名前解決します。
プログラム
#include <stdio.h>
#include <stdlib.h>
#include <netdb.h>
#include <errno.h>
/*!
* @brief ホスト名を表示する
* @param[in] host ホストエントリ
*/
static void
print_hostname(struct hostent *host)
{
int i;
/* 正式ホスト名を表示する */
fprintf(stdout, "genelic hostname = %s\n", host->h_name);
/* エイリアス名一覧を表示する */
for(i=0; host->h_aliases[i]; i++){
fprintf(stdout, "alias(%d) = %s\n", i, host->h_aliases[i]);
}
}
/*!
* @brief IPアドレス(IPv4)を表示する
* @param[in] host ホストエントリ
*/
static void
print_ipaddr_v4(struct hostent *host)
{
int i;
/* IPv4ならば4バイト */
if(host->h_length != 4){
fprintf(stdout, "IPv6 address.");
return;
}
for(i=0; host->h_addr_list[i]; i++){
fprintf(stdout, "IP address(%d) = %d.%d.%d.%d\n" , i,
(unsigned char)*((host->h_addr_list[i])) ,
(unsigned char)*((host->h_addr_list[i]) + 1) ,
(unsigned char)*((host->h_addr_list[i]) + 2) ,
(unsigned char)*((host->h_addr_list[i]) + 3)
);
}
}
/*!
* @brief ホストの名前解決を行う。
* @param[in] hostname ホスト名
* @return 成功ならば0、失敗ならば-1を返す。
*/
static int
resolve_hostname(char *hostname)
{
struct hostent *host = NULL;
/* ホスト情報を取得する */
host = gethostbyname(hostname);
if(host == NULL){
fprintf(stderr, "gethostbyname() failed: %s\n", strerror(errno));
return(-1);
}
/* ホスト情報を出力する */
print_hostname(host);
print_ipaddr_v4(host);
return(0);
}
/*!
* @brief main routine
* @return 成功ならば0、失敗ならば-1を返す。
*/
int
main(int argc, char *argv[])
{
int rc = 0;
if(argc != 2){
fprintf(stdout, "%s <hostname>\n", argv[0]);
return(-1);
}
rc = resolve_hostname(argv[1]);
if(rc != 0){
return(-1);
}
return(0);
}
関連ページ
- C言語
- C言語-ソケットプログラミング_ホスト名からIPアドレスを得る
- C言語-ソケットプログラミング_IPアドレスからホスト名を得る
- C言語-ソケットプログラミング_IPアドレス表記の変換
- C言語-ソケットプログラミング_TCPポートスキャン
- C言語-ソケットプログラミング_ブロードキャスト送信
- C言語-ソケットプログラミング_ブロードキャスト受信
- C言語-ソケットプログラミング_マルチキャスト送信
- C言語-ソケットプログラミング_マルチキャスト受信