getaddrinfo(単純な例)

昔はIPでの名前解決を行なうためにgethostbynameを使うのが一般的でしたが、IPv6の登場とともに、名前解決にgetaddrinfo()を使わなくてはならなくなってしまいました。 IPv6を使う使わないに関わらず、gethostbynameの代わりにgetaddrinfoを利用すべきです。

ここでは、Mac OS Xとgccという環境でgetaddrinfoを使った例を説明します。

単純な例

getaddrinfoを利用した簡単なサンプルです。 まずは、IPv4のみです。 しかも、文字列から32ビットのIPv4アドレス値を取得するというgethostbynameと同じ使い方ような使い方をしています。


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

int
main()
{
 char *hostname = "localhost";
 struct addrinfo hints, *res;
 struct in_addr addr;
 int err;

 memset(&hints, 0, sizeof(hints));
 hints.ai_socktype = SOCK_STREAM;
 hints.ai_family = AF_INET;

 if ((err = getaddrinfo(hostname, NULL, &hints, &res)) != 0) {
   printf("error %d\n", err);
   return 1;
 }

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

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

 freeaddrinfo(res);

 return 0;
}

getaddrinfoで確保したメモリは、freeaddrinfoを使って開放します。 freeaddrinfoを使うのを結構忘れてしまうので、気をつけましょう。