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