EN JA
GETIPNODEBYNAME(3)
GETIPNODEBYNAME(3) FreeBSD Library Functions Manual GETIPNODEBYNAME(3)

名称

getipnodebyname, getipnodebyaddr, freehostentノード名からアドレスおよびアドレスからノード名変換

ライブラリ

Standard C Library (libc, -lc)

書式

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

struct hostent *
getipnodebyname( const char *name, int af, int flags, int *error_num);

struct hostent *
getipnodebyaddr( const void *src, size_t len, int af, int *error_num);

void
freehostent( struct hostent *ptr);

解説

getipnodebyname() および getipnodebyaddr() 関数は、 gethostbyname(3), gethostbyname2(3) および gethostbyaddr(3) にたいへん似ています。関数は、より古いものによって提供される機能性をすべてカバーし、プログラマによりよいインタフェースを提供します。関数はアドレスファミリおよびオペレーションモードの指定のために、追加の引数 af および flags を要求します。追加の引数は、特定のアドレスファミリ ( AF_INET または AF_INET6 のような) のためにプログラマがノード名のためにアドレスを得ることを可能にします。関数はさらに付加的なポインタ引数、スレッドセーフエラーコードリターンをサポートするために適切なエラーコードを返す error_num を要求します。

返り値のタイプおよび使用法、 struct hostentgethostbyname(3) に記述されます。

getipnodebyname() については、 name 引数がノード名あるいは数値アドレス文字列 (つまり、ドットのある 10 進の IPv4 アドレスあるいは IPv6 16進アドレス) のいずれかでありえます。 af 引数はアドレスファミリ AF_INET あるいは AF_INET6 のいずれかを指定します。 flags 引数は、検索されるアドレスのタイプおよび返されるアドレスのタイプを指定します。 AI_DEFAULT (下記に定義) の特別のフラグ値はほとんどのアプリケーションで操作すべきであることに注意してください。すなわち、IPv6 を使用するために単純なアプリケーションを移植することは、呼び出しを置き換えます。

hptr = gethostbyname(name);

は、次に置き換えます

hptr = getipnodebyname(name, AF_INET6, AI_DEFAULT, &error_num);

検索し、返されたアドレスのタイプに対するより素晴らしい制御を望むアプリケーションは、 flags 引数の他の組み合わせを指定できます。

0flagsaf 引数の厳密な解釈を意味します。

  • flags が 0 で、 afAF_INET である場合、呼び出し側は IPv4 アドレスだけを望みます。問い合わせ (クエリ) は A レコードのために行なわれます。成功する場合、IPv4 アドレスは返され、 hostent 構造体の h_length メンバは 4 になるでしょう、他の場合、関数は NULL ポインタを返します。
  • flags が 0 である場合、および afAF_INET6 である場合、呼び出し側は IPv6 アドレスだけを望みます。問い合わせ (クエリ) は AAAA レコードのために行なわれます。成功する場合、IPv6 アドレスは返され、 hostent 構造体の h_length メンバは 16 になるでしょう、他の場合は関数は NULL ポインタを返します。

他の定数は関数の振る舞いを修正するために flags 引数へ論理和 (OR) できます。

  • AI_V4MAPPED フラグが AF_INET6af と共に指定される場合、呼び出し側は IPv4 をマップした IPv6 アドレスを受け付けるでしょう。すなわち、 AAAA レコードがそのとき見つからない場合、問い合わせ (クエリ) は A レコードのために行なわれます。また、いずれかが見つかった場合は、IPv4 をマップした IPv6 アドレス ( h_length は 16 となるでしょう) として返されます。もし afAF_INET6 と等しくなければ、 AI_V4MAPPED フラグが無視されます。
  • カーネルが IPv4 をマップした IPv6 アドレスをサポートする場合のみ、 AI_V4MAPPED_CFG フラグは AI_V4MAPPED フラグと全く同じです。
  • AI_ALL フラグが AI_V4MAPPED フラグと共に使用される場合、IPv6 アドレスファミリでのみ使用されます。 AI_ALLAI_V4MAPPED フラグで論理和 (or) される時、呼び出し側はすべてのアドレス、IPv6 および IPv4 をマップした IPv6 を望みます。問い合わせ (クエリ) は、 AAAA レコードのために最初にされます、そして、成功する場合、 IPv6 アドレスが返されます。その後、別の問い合わせ (クエリ) は A レコードのためにされます、そして、どれでも検出されたものは、IPv4 をマップした IPv6 アドレスとして返されます。 h_length は 16 となるでしょう。両方の問い合わせ (クエリ) が失敗する場合のみ、関数は NULL ポインタを返します。もし af が AF_INET6 と等しくなければ、このフラグが無視されます。 AI_ALL および AI_V4MAPPED の両方が指定される場合、 AI_ALL は優先をとります。
  • AI_ADDRCONFIG フラグは、ノードが少なくとも 1 つの IPv6 ソースアドレス設定を持っている場合のみ AAAA レコードのための問い合わせ (クエリ) が生じるべきであることを指定します、また、ノードが少なくとも 1 つの IPv4 ソースアドレス設定を持っている場合のみ、 A レコードのための問い合わせ (クエリ) が生じるべきです。

    例えば、ノードが IPv6 ソースアドレス設定を持たない場合、および af が AF_INET6 と等しい場合、および調べられたノード名が AAAA および A レコードの両方を持っている場合、(a) AI_ADDRCONFIG のみが指定される場合、関数は NULL ポインタを返します。 (b) AI_ADDRCONFIG | AI_V4MAPPED が指定される場合、 A レコードは IPv4 をマップした IPv6 アドレスとして返されます。

AI_DEFAULT の特別のフラグ値は次のように定義されます。

#define  AI_DEFAULT  (AI_V4MAPPED_CFG | AI_ADDRCONFIG)

getipnodebyname() 関数は name 引数がノード名あるいはリテラルアドレス文字列 (すなわち、ドットのある 10 進の IPv4 アドレスあるいは IPv6 の 16 進アドレス) のいずれかであるのを可能にしなければならないことに注意してください。これは、アプリケーションがリテラルアドレス文字列を扱うために inet_pton(3) を呼ばなければならなくてもよいようにします。 name 引数がリテラルアドレス文字列である時、 flags 引数は常に無視されます。

リテラルアドレス文字列のタイプおよび af 引数の値に基づいた 4 つのシナリオ (筋書き) があります。 2 つの単純なケースは name がドットある 10 進の IPv4 アドレスおよび afAF_INET と同じである場合、あるいは name が IPv6 の 16 進アドレスおよび afAF_INET6 と同じである場合です。返された hostent 構造体のメンバは次のとおりです。 h_namename 引数のコピーを指します。 h_aliasesNULL ポインタです、 h_addrtypeaf 引数のコピーです。 h_length は 4 ( AF_INET に対して) あるいは 16 ( AF_INET6 に対して) のどちらかです。 h_addr_list[0] は 4 バイトあるいは 16 バイトのバイナリのアドレスへのポインタです。 h_addr_list[1]NULL ポインタです。

name がドットのある 10 進の IPv4 アドレスおよび afAF_INET6 と同じで、 AI_V4MAPPED が指定される場合、IPv4 をマップした IPv6 アドレスが返されます。 h_name は IPv4 をマップした IPv6 アドレスを含んでいる IPv6 の 16 進力アドレスを指します。 h_aliasesNULL ポインタです h_addrtypeAF_INET6 です。 h_length は 16 です、 h_addr_list[0] は 16 バイトのバイナリアドレスへポインタです。 h_addr_list[1]NULL ポインタです。

name が IPv6 の 16 進アドレスおよび afAF_INET と等しい場合、それはエラーです。関数の返り値は NULL ポインタおよび HOST_NOT_FOUND と等しい error_num によって指される値です。

getipnodebyaddr() 関数は gethostbyaddr(3) とほとんど同じ引数をとります。しかし、エラー番号を返すためにポインタを加えます。さらに、それは、IPv4 をマップした IPv6 アドレスおよび IPv4 互換の IPv6 アドレスを処理します。

getipnodebyname() および getipnodebyaddr() 関数は、ダイナミックに呼び出し側に返される構造体を割り付けます。 freehostent() 関数は、 getipnodebyname() または getipnodebyaddr() によって割り付けられ返されたメモリ領域を再利用するようにします。

関連ファイル

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

診断

getipnodebyname() および getipnodebyaddr() 関数は、エラーの場合 NULL を返します。 error_num によって指される整数値はこれが一時的失敗あるいは無効あるいは未知のホストかどうか確かめるためにチェックされるかもしれません。各エラーコードの意味は gethostbyname(3) に記述されます。

関連項目

getaddrinfo(3), gethostbyaddr(3), gethostbyname(3), getnameinfo(3), hosts(5), nsswitch.conf(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.

規格

getipnodebyname() および getipnodebyaddr() 関数は、“Basic Socket Interface Extensions for IPv6” (RFC2553) で文書化されます。

歴史

実装は、KAME アドバンストネットワーキングキットではじめて登場しました。

バグ

getipnodebyname() と getipnodebyaddr() 関数は限定された IPv6 アドレスを適切に取り扱いません。利用者がこれらの関数を使用すれば、利用者のプログラムは限定された IPv6 アドレスを取り扱うことができないでしょう。 IPv6 アドレス操作については、 getaddrinfo( 3) と getnameinfo( 3) が推奨されます。

テキストは、RFC2553 からずうずうしくコピーされました。

August 6, 2004 FreeBSD