kazmax - Linux で自宅サーバー

getnameinfo - ライブラリコールの説明 - Linux コマンド集 一覧表

  1. 名前
  2. 書式
  3. 説明
  4. 返り値
  5. ファイル
  6. 注意
  7. 準拠
  8. 関連項目

名前

getnameinfo - アドレスから名前への変換をプロトコルに依存しないかたちで行う

書式

#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);

説明

getnameinfo(3) 関数は、アドレスからノード名への変換を プロトコルに依存しないかたちで行うために規定された。 この関数は gethostbyaddr (3)と getservbyport (3)の機能を一つにしたもので、   getaddrinfo (3) と逆の動作を行う。 sa 引き数は、 IP アドレスとポート番号の情報を保持している 汎用的なソケットアドレス構造体 ( sockaddr_in 型または sockaddr_in6 型) へのポインターである。 salensa のサイズである。 hostserv 引き数は、(それぞれサイズが hostlenservlen の) バッファへのポインターであり、 ここに結果の値が格納される。
ホスト名が不要であることをこの関数に伝えるには、 host に NULL を指定するか、 hostlen に 0 を指定する。同様に、サービス名が不要な場合は、 serv に NULL を指定するか、 servlen に 0 を指定する。 しかし、ホスト名とサービス名の両方を不要だと指定することはできない (いずれか一方は要求すること)。
flags 引き数で   getnameinfo (3) の動作を変えることができる。指定できる値は以下の通り:

NI_NOFQDN
指定すると、ローカルなホストには FQDN のホスト名の部分のみを返す。
NI_NUMERICHOST
指定すると、ホスト名の数値表式が返される。 (指定しなくても、ノードの名前が引けない場合はこのようになることはある)。
NI_NAMEREQD
指定すると、ホスト名が引けなかった場合にエラーを返す。
NI_NUMERICSERV
指定すると、サービス名が数値表式 (例えばポート番号) で返される。
NI_DGRAM
指定すると、ストリームベース (TCP) でなくデータグラムベース (UDP) のサービスを対象にする。数は少ないが、 UDP と TCP で違うサービスを提供しているポート (512-514) に対して必要となる。

返り値

成功すると 0 が返り、(要求されていれば) ノードとサービスの名前が NULL 終端された文字列の形式でそれぞれの指定バッファに返される (バッファの長さにあうように縮められるかもしれない)。 エラーの場合は、以下の 0 以外のエラー・コードが返される:

EAI_AGAIN
指定された名前が現時点では解決できなかった。 後で再試行してみること。
EAI_BADFLAGS
flags 引き数に不正な値が与えられた。
EAI_FAIL
回復できないエラーが発生した。
EAI_FAMILY
指定したアドレスファミリーが認識できなかった。 あるいはアドレスの長さが指定されたファミリーに合うものでなかった。
EAI_MEMORY
メモリが足りない。
EAI_NONAME
与えられたパラメータでは名前が解決できない。 NI_NAMEREQD が設定されていたがホスト名が決定できなかったか、 ホスト名もサービス名も要求されなかった。
EAI_OVERFLOW
host または serv が指しているバッファが小さすぎた。
EAI_SYSTEM
システムエラーが起った。 エラーコードは errno に設定される。

gai_strerror (3)関数を使うと、これらのエラー・コードを、エラー・レポートに適した 人間が読みやすい文字列に翻訳してくれる。

ファイル

/etc/hosts
/etc/nsswitch.conf
/etc/resolv.conf

注意

適切なバッファサイズを選択できるように、 <netdb.h> に以下の定数が定義されている。

# define NI_MAXHOST      1025


# define NI_MAXSERV 32


前者は、最近のバージョンの BIND のヘッダファイル <arpa/nameser.h> 中の定数 MAXDNAME と同じ値である。 後者は、割り当て済の数値について記した現在の RFC に 列挙されてサービスから推量した値である。

以下のコードは、指定されたソケットアドレスに対する ホストとサービスの数値表式を取得しようと試みる。 特定のアドレスファミリーに対する参照情報は 一切ハードコードされていないことに着目してほしい。

  struct sockaddr *sa;    /* input */
  char hbuf[NI_MAXHOST], sbuf[NI_MAXSERV];


if (getnameinfo(sa, sa->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 */ char hbuf[NI_MAXHOST];
if (getnameinfo(sa, sa->sa_len, hbuf, sizeof(hbuf), NULL, 0, NI_NAMEREQD)) printf("could not resolve hostname"); else printf("host=%s\n", hbuf);

準拠

RFC2553, POSIX.1-2001.

関連項目

  getaddrinfo (3),  gethostbyaddr (3), getservbyname (3), getservbyport (3),  inet_ntop (3),  socket (3),  hosts (5),   services (5),   hostname (7),   named (8) 

R. Gilligan, S. Thomson, J. Bound and W. Stevens, Basic Socket Interface Extensions for IPv6 ,RFC2553, 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