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);
}



関連ページ