C言語にて ホスト名からIPアドレスを取得する

DNS 名前解決

ホスト名からIPアドレスを取得するには、
DNSサーバーによる名前解決 (Name Resolution) を利用する。

ホスト名からIPアドレスを取得することを DNS正引き( Forward DNS Lookup)、
IPアドレスからホスト名を取得することを DNS逆引き( Reverse DNS Lookup )
という。

JPRS : 名前解決
https://jprs.jp/glossary/index.php?ID=0084

NIC : 正引き/逆引きとは
https://www.nic.ad.jp/ja/basics/terms/seibiki-gyakubiki.html

コマンドラインにて、ホスト名からIPアドレスを取得するには、host コマンドを使用する。

host - DNSを使ってホスト名を検索 - Linuxコマンド
https://webkaru.net/linux/host-command/

C言語にて ホスト名からIPアドレスを取得するには、 getaddrinfo 関数を使用する。
。 この関数は、OSのシステムコールである。
RFC 2553 で規定されている。
バックエンドで DNSサーバーへの問い合わせを行なっている。
インターネットに接続されていないと、使用できない。

gethostbyname という関数もあるが、こちらは非推奨。

GETADDRINFO https://linuxjm.osdn.jp/html/LDP_man-pages/man3/getaddrinfo.3.html

GETHOSTBYNAME https://linuxjm.osdn.jp/html/LDP_man-pages/man3/gethostbyname.3.html

RFC 2553
Basic Socket Interface Extensions for IPv6
http://www5d.biglobe.ne.jp/stssk/rfc/rfc2553j.html

C言語にて IPアドレスを取得する

下記を参考にした。
getaddrinfo
https://www.geekpage.jp/programming/linux-network/getaddrinfo-4.php

下記のようなコードになる。

#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>

struct addrinfo hints, *info;
  
memset( &hints, 0, sizeof(hints) );

hints.ai_family   = AF_INET;
hints.ai_socktype = SOCK_STREAM;

getaddrinfo( hostname, NULL, &hints, &info );

struct in_addr addr;

addr.s_addr = ((struct sockaddr_in *)(info->ai_addr))->sin_addr.s_addr;

printf( "ipaddress: %s \n", inet_ntoa(addr) );

freeaddrinfo(info);

C言語にて ホスト名を取得する

IPアドレスからホスト名を取得するに getnameinfo を使用する。

GETNAMEINFO
https://linuxjm.osdn.jp/html/LDP_man-pages/man3/getnameinfo.3.html

なお、ホスト名からIPアドレスを取得して、 IPアドレスからホスト名を取得しても、 元のホスト名は取得できるとは限らない。

例えば、google.com だと、下記のようになる。

元のホスト名: google.com getaddrinfo で取得したIPアドレス: 172.217.26.46 getnameinfo で取得したホスト名: nrt12s17-in-f46.1e100.net

Githubにコードを公開した。 https://github.com/ohwada/MAC_cpp_Samples/tree/master/network/ipaddr