#include <sys/socket.h> #include <netdb.h> int getnameinfo(const struct sockaddr *sa, socklen_t salen, char *host, size_t hostlen, char *serv, size_t servlen, int flags);
glibc 向けの機能検査マクロの要件 (feature_test_macros(7) 参照):
getnameinfo(): _POSIX_C_SOURCE >= 1 || _XOPEN_SOURCE || _POSIX_SOURCE
sa 引き数は、 IP アドレスとポート番号の情報を保持している 汎用的なソケットアドレス構造体 (sockaddr_in 型または sockaddr_in6 型) へのポインタである。 salen は sa のサイズである。 host と serv 引き数は、(それぞれサイズが hostlen と servlen の) 呼び出し側で確保されたバッファへのポインタであり、 ホスト名とサービス名を含む NULL 終端された文字列が それぞれのバッファに格納される。
ホスト名が不要であることをこの関数に伝えるには、 host に NULL を指定するか、 hostlen に 0 を指定する。同様に、サービス名が不要な場合は、 serv に NULL を指定するか、 servlen に 0 を指定する。 しかし、ホスト名とサービス名の両方を不要だと指定することはできない (いずれか一方は要求すること)。
flags 引き数で getnameinfo() の動作を変えることができる。指定できる値は以下の通り:
glibc 2.3.4 から、 getnameinfo() に拡張が行われ、ホスト名と 国際化ドメイン名 (Internationalized Domain Name; IDN) 形式との間で 透過的な変換ができるようになっている (IDN 形式については RFC 3490 の Internationalizing Domain Names in Applications (IDNA) を参照)。3つのフラグが新たに定義されている:
gai_strerror(3) 関数を使うと、これらのエラー・コードを、エラー・レポートに適した 人間が読みやすい文字列に翻訳してくれる。
#define NI_MAXHOST 1025 #define NI_MAXSERV 32
glibc 2.8 以降では、機能検査マクロ _BSD_SOURCE, _SVID_SOURCE, _GNU_SOURCE のいずれかが定義された場合にのみ、これらの定義が公開される。
前者は、最近のバージョンの BIND のヘッダファイル <arpa/nameser.h> 中の定数 MAXDNAME と同じ値である。 後者は、割り当て済の数値について記した現在の RFC に 列挙されてサービスから推量した値である。
struct sockaddr *sa; /* input */ socklen_t len; /* input */ char hbuf[NI_MAXHOST], sbuf[NI_MAXSERV]; if (getnameinfo(sa, len, hbuf, sizeof(hbuf), sbuf, sizeof(sbuf), NI_NUMERICHOST | NI_NUMERICSERV) == 0) printf("host=%s, serv=%s\n", hbuf, sbuf);
以下ではソケットアドレスに 逆向きのアドレスマッピングが存在するかをチェックしている。
struct sockaddr *sa; /* input */ socklen_t len; /* input */ char hbuf[NI_MAXHOST]; if (getnameinfo(sa, len, hbuf, sizeof(hbuf), NULL, 0, NI_NAMEREQD)) printf("could not resolve hostname"); else printf("host=%s\n", hbuf);
getnameinfo() を使ったプログラム例が getaddrinfo(3) に記載されている。
R. Gilligan, S. Thomson, J. Bound and W. Stevens, Basic Socket Interface Extensions for IPv6, RFC 2553, March 1999.
Tatsuya Jinmei and Atsushi Onoe, An Extension of Format for IPv6 Scoped Addresses, internet draft, work in progress. ftp://ftp.ietf.org/internet-drafts/draft-ietf-ipngwg-scopedaddr-format-02.txt
Craig Metz, Protocol Independence Using the Sockets API, Proceedings of the freenix track: 2000 USENIX annual technical conference, June 2000. http://www.usenix.org/publications/library/proceedings/usenix2000/freenix/metzprotocol.html