GETNAMEINFO(3) | Linux Programmer's Manual | GETNAMEINFO(3) |
getnameinfo - アドレスから名前への変換をプロトコルに依存しないかたちで行う
#include <sys/socket.h> #include <netdb.h>
int getnameinfo(const struct sockaddr *addr, socklen_t addrlen, char *host, socklen_t hostlen, char *serv, socklen_t servlen, int flags);
getnameinfo():
glibc 2.22 以降: _POSIX_C_SOURCE >= 200112L
glibc 2.21 以前: _POSIX_C_SOURCE
getnameinfo() 関数は、 getaddrinfo(3) の逆の動作を行う。つまり、プロトコルに依存しないかたちで ソケットアドレスから対応するホスト名とサービスへの変換を行う。 この関数は gethostbyaddr(3) と getservbyport(3) の機能を一つにしたものだが、 これらの関数と違い、 getnameinfo(3) はリエントラントであり、IPv4 と IPv6 の差分に依存しないかたちで プログラムを書くことができる。
addr 引数は、 IP アドレスとポート番号の情報を保持している 汎用的なソケットアドレス構造体 (sockaddr_in 型または sockaddr_in6 型) へのポインターである。 addrlen は addr のサイズである。 host と serv 引数は、(それぞれサイズが hostlen と servlen の) 呼び出し側で確保されたバッファーへのポインターであり、 ホスト名とサービス名を含むヌル終端された文字列が それぞれのバッファーに格納される。
ホスト名が不要であることをこの関数に伝えるには、 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つのフラグが新たに定義されている:
成功すると 0 が返り、(要求されていれば) ノードとサービスの名前がヌル終端された文字列の形式でそれぞれの指定バッファーに返される (バッファーの長さにあうように縮められるかもしれない)。 エラーの場合は、以下の 0 以外のエラーコードが返される:
gai_strerror(3) 関数を使うと、 これらのエラーコードを、 エラーレポートに適した人間が読みやすい文字列に翻訳してくれる。
/etc/hosts
/etc/nsswitch.conf
/etc/resolv.conf
getnameinfo() は、glibc バージョン 2.1 以降で提供されている。
この節で使用されている用語の説明は attributes(7) を参照のこと。
Interface | Attribute | Value |
getnameinfo() | Thread safety | MT-Safe env locale |
POSIX.1-2001, POSIX.1-2008, RFC 2553.
適切なバッファーサイズを選択できるように、 <netdb.h> に以下の定数が定義されている。
#define NI_MAXHOST 1025 #define NI_MAXSERV 32
Since glibc 2.8, these definitions are exposed only if suitable feature test macros are defined, namely: _GNU_SOURCE, _DEFAULT_SOURCE (since glibc 2.19), or (in glibc versions up to and including 2.19) _BSD_SOURCE or _SVID_SOURCE.
前者は、最近のバージョンの BIND のヘッダーファイル <arpa/nameser.h> 中の定数 MAXDNAME と同じ値である。 後者は、割り当て済の数値について記した現在の RFC に 列挙されてサービスから推量した値である。
glibc バージョン 2.2 より前では、 引数 hostlen, servlen の型は size_t であった。
以下のコードは、指定されたソケットアドレスに対する ホストとサービスの数値表式を取得しようと試みる。 特定のアドレスファミリーに対する参照情報は 一切ハードコードされていないことに着目してほしい。
struct sockaddr *addr; /* input */ socklen_t addrlen; /* input */ char hbuf[NI_MAXHOST], sbuf[NI_MAXSERV]; if (getnameinfo(addr, addrlen, hbuf, sizeof(hbuf), sbuf, sizeof(sbuf), NI_NUMERICHOST | NI_NUMERICSERV) == 0) printf("host=%s, serv=%s\n", hbuf, sbuf);
以下ではソケットアドレスに 逆向きのアドレスマッピングが存在するかをチェックしている。
struct sockaddr *addr; /* input */ socklen_t addrlen; /* input */ char hbuf[NI_MAXHOST]; if (getnameinfo(addr, addrlen, hbuf, sizeof(hbuf), NULL, 0, NI_NAMEREQD)) printf("could not resolve hostname"); else printf("host=%s\n", hbuf);
getnameinfo() を使ったプログラム例が getaddrinfo(3) に記載されている。
accept(2), getpeername(2), getsockname(2), recvfrom(2), socket(2), getaddrinfo(3), gethostbyaddr(3), getservbyname(3), getservbyport(3), inet_ntop(3), hosts(5), services(5), hostname(7), named(8)
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.
この man ページは Linux man-pages プロジェクトのリリース 5.10 の一部である。プロジェクトの説明とバグ報告に関する情報は https://www.kernel.org/doc/man-pages/ に書かれている。
2020-06-09 | GNU |