IPアドレスからホスト名への変換(gethostbyaddr)
「127.0.0.1」などのIPアドレスに対応するホスト名を知りたい場合があると思います。 また、TCPサーバでacceptを行った時などに相手のIPアドレスが32ビットの値として取得できますが、この32ビットの値に対応するホスト名を知りたい場合もあると思います。 ここでは、gethostbyaddrを利用してIPアドレスからホスト名を取得する方法を説明します。
gethostbyaddr
IPアドレスからホスト名への変換はgethostbyaddrを利用して行います。 gethostbyaddrはDNSに問い合わせてIPアドレスに対応するホスト名を調べる、逆引きを行ってくれます。 手元のhostsファイルなどにホスト名が登録してある場合にはそこから情報を取得します。
#include <stdio.h>
#include <winsock2.h>
#define ADDRESS "127.0.0.1"
int
main()
{
WSADATA wsaData;
struct in_addr addr;
struct hostent *host;
WSAStartup(MAKEWORD(2,0), &wsaData);
/* 文字列で表現されるIPアドレスを32ビットのバイナリ値に変換 */
addr.S_un.S_addr = inet_addr(ADDRESS);
/* IPアドレスからホスト名を取得 */
host = gethostbyaddr((const char *)&addr.S_un.S_addr,
sizeof(addr.S_un.S_addr), AF_INET);
if (host == NULL) {
/* 失敗したらエラーを表示して終了 */
printf("gethostbyaddr : %d\r\n", WSAGetLastError());
return 1;
}
/* 結果を表示 */
printf("%s\n", host->h_name);
WSACleanup();
return 0;
}
gethostbyaddrは非常に簡単に利用できます。 単純にIPアドレスを表す32ビットの変数を渡すだけです。 gethostbyaddrはIPv4にしか対応していないため、3つ目の引数はAF_INETでなければなりません。 (gethostbyaddrはIPv6に対応していません。)