IPアドレスからホスト名への変換(gethostbyaddr)

「127.0.0.1」などのIPアドレスに対応するホスト名を知りたい場合があります。 また、TCPサーバでacceptを行った時などに相手のIPアドレスが32ビットの値として取得できますが、この32ビットの値に対応するホスト名を知りたい場合もあります。 ここでは、gethostbyaddrを利用してIPアドレスからホスト名を取得する方法を説明します。

gethostbyaddr

IPアドレスからホスト名への変換はgethostbyaddrを利用して行います。 gethostbyaddrはDNSに問い合わせてIPアドレスに対応するホスト名を調べる、逆引きを行ってくれます。 /etc/hostsなどにホスト名が登録してある場合にはそこから情報を取得します。


#include <stdio.h>

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

#define	ADDRESS	"127.0.0.1"

int
main()
{
  struct hostent *host;
  struct in_addr addr;

  /* 文字列で表現されるIPアドレスを32ビットのバイナリ値に変換 */
  addr.s_addr = inet_addr(ADDRESS);

  /* IPアドレスからホスト名を取得 */
  host = gethostbyaddr((const char *)&addr.s_addr,
                       sizeof(addr.s_addr), AF_INET);
  if (host == NULL) {
    /* gethostbyaddrのエラーはperrorでは無いので注意 */
    herror("gethostbyaddr");
    return 1;
  }

  /* 結果を表示 */
  printf("%s\n", host->h_name);

  return 0;
}


gethostbyaddrは非常に簡単に利用できます。 引数としてIPアドレスを表す32ビットの変数を渡すだけです。 gethostbyaddrはIPv4にしか対応していないため、3つ目の引数はAF_INETでなければなりません。 (gethostbyaddrはIPv6に対応していません。)