C言語-ソケットプログラミング_IPアドレスからホスト名を得る

gethostbyaddr()関数

IPアドレス(例えば"127.0.0.1"などの文字列)からホスト名を得るにはgethostbyaddr()関数を利用します。

gethostbyaddr()は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      IPアドレスの名前解決を行う。
 * @param[in]  ipaddr  IPアドレス(xx.xx.xx.xx表記の文字列)
 * @return     成功ならば0、失敗ならば-1を返す。
 */
static int
resolve_ipaddr(char *ipaddr)
{
    struct hostent *host = NULL;
    struct in_addr addr;

    /* 文字列表現のIPアドレスをバイナリ値に変換する */
    addr.s_addr = inet_addr(ipaddr);

    /* IPアドレスからホスト名を取得 */
    host = gethostbyaddr((const char *)&addr.s_addr,
                         sizeof(addr.s_addr), AF_INET);
    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 <ip-address>\n", argv[0]);
        return(-1);
    }

    rc = resolve_ipaddr(argv[1]);
    if(rc != 0){
        return(-1);
    }

    return(0);
}


関連ページ