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