OSDN Git Service

(split) LDP: Restore and add Copyrights for draft pages
[linuxjm/LDP_man-pages.git] / draft / man3 / getaddrinfo.3
1 .\" Copyright (c) 2007, 2008 Michael Kerrisk <mtk.manpages@gmail.com>
2 .\" and Copyright (c) 2006 Ulrich Drepper <drepper@redhat.com>
3 .\" A few pieces of an earlier version remain:
4 .\" Copyright 2000, Sam Varshavchik <mrsam@courier-mta.com>
5 .\"
6 .\" %%%LICENSE_START(VERBATIM)
7 .\" Permission is granted to make and distribute verbatim copies of this
8 .\" manual provided the copyright notice and this permission notice are
9 .\" preserved on all copies.
10 .\"
11 .\" Permission is granted to copy and distribute modified versions of this
12 .\" manual under the conditions for verbatim copying, provided that the
13 .\" entire resulting derived work is distributed under the terms of a
14 .\" permission notice identical to this one.
15 .\"
16 .\" Since the Linux kernel and libraries are constantly changing, this
17 .\" manual page may be incorrect or out-of-date.  The author(s) assume no
18 .\" responsibility for errors or omissions, or for damages resulting from
19 .\" the use of the information contained herein.  The author(s) may not
20 .\" have taken the same level of care in the production of this manual,
21 .\" which is licensed free of charge, as they might when working
22 .\" professionally.
23 .\"
24 .\" Formatted or processed versions of this manual, if unaccompanied by
25 .\" the source, must acknowledge the copyright and authors of this work.
26 .\" %%%LICENSE_END
27 .\"
28 .\" References: RFC 2553
29 .\"
30 .\" 2005-08-09, mtk, added AI_ALL, AI_ADDRCONFIG, AI_V4MAPPED,
31 .\"                     and AI_NUMERICSERV.
32 .\" 2006-11-25, Ulrich Drepper <drepper@redhat.com>
33 .\"     Add text describing Internationalized Domain Name extensions.
34 .\" 2007-06-08, mtk: added example programs
35 .\" 2008-02-26, mtk; clarify discussion of NULL 'hints' argument; other
36 .\"     minor rewrites.
37 .\" 2008-06-18, mtk: many parts rewritten
38 .\" 2008-12-04, Petr Baudis <pasky@suse.cz>
39 .\"     Describe results ordering and reference /etc/gai.conf.
40 .\" FIXME . glibc's 2.9 NEWS file documents DCCP and UDP-lite support
41 .\"           and is SCTP support now also there?
42 .\"
43 .\"*******************************************************************
44 .\"
45 .\" This file was generated with po4a. Translate the source file.
46 .\"
47 .\"*******************************************************************
48 .\"
49 .\" Japanese Version Copyright (c) 2001 NAKANO Takeo all rights reserved.
50 .\" Translated Sun Jan 14 2001 by NAKANO Takeo <nakano@apm.seikei.ac.jp>
51 .\" Updated 2005-10-09 by Kentaro Shirakata <argrath@ub32.org>
52 .\" Updated 2007-01-01 by Kentaro Shirakata <argrath@ub32.org>
53 .\" Updated 2007-06-13, Akihiro MOTOKI <amotoki@dd.iij4u.or.jp>, LDP v2.55
54 .\" Updated 2008-04-04, Akihiro MOTOKI, LDP v2.79
55 .\" Updated 2008-08-11, Akihiro MOTOKI, LDP v3.05
56 .\" Updated 2008-11-09, Akihiro MOTOKI, LDP v3.13
57 .\" Updated 2008-12-26, Akihiro MOTOKI, LDP v3.15
58 .\" Updated 2010-04-18, Akihiro MOTOKI, LDP v3.24
59 .\" Updated 2012-04-30, Akihiro MOTOKI <amotoki@gmail.com>
60 .\" Updated 2012-05-29, Akihiro MOTOKI <amotoki@gmail.com>
61 .\" Updated 2013-05-01, Akihiro MOTOKI <amotoki@gmail.com>
62 .\"
63 .TH GETADDRINFO 3 2013\-01\-15 GNU "Linux Programmer's Manual"
64 .SH 名前
65 getaddrinfo, freeaddrinfo, gai_strerror \- ネットワークのアドレスとサービスを変換する
66 .SH 書式
67 .nf
68 \fB#include <sys/types.h>\fP
69 \fB#include <sys/socket.h>\fP
70 \fB#include <netdb.h>\fP
71 .sp
72 \fBint getaddrinfo(const char *\fP\fInode\fP\fB, const char *\fP\fIservice\fP\fB,\fP
73 \fB                const struct addrinfo *\fP\fIhints\fP\fB,\fP
74 \fB                struct addrinfo **\fP\fIres\fP\fB);\fP
75 .sp
76 \fBvoid freeaddrinfo(struct addrinfo *\fP\fIres\fP\fB);\fP
77 .sp
78 \fBconst char *gai_strerror(int \fP\fIerrcode\fP\fB);\fP
79 .fi
80 .sp
81 .in -4n
82 glibc 向けの機能検査マクロの要件 (\fBfeature_test_macros\fP(7)  参照):
83 .ad l
84 .in
85 .sp
86 \fBgetaddrinfo\fP(), \fBfreeaddrinfo\fP(), \fBgai_strerror\fP():
87 .RS 4
88 _POSIX_C_SOURCE\ >=\ 1 || _XOPEN_SOURCE || _POSIX_SOURCE
89 .RE
90 .ad b
91 .SH 説明
92 .\" .BR getipnodebyname (3),
93 .\" .BR getipnodebyaddr (3),
94 \fBgetaddrinfo\fP()  は、(インターネットのホストとサービスを識別する)  \fInode\fP と \fIservice\fP を渡すと、一つ以上の
95 \fIaddrinfo\fP 構造体を返す。それぞれの \fIaddrinfo\fP 構造体には、 \fBbind\fP(2)  や \fBconnect\fP(2)
96 を呼び出す際に指定できるインターネットアドレスが格納されている。 \fBgetaddrinfo\fP()  関数は、 \fBgethostbyname\fP(3)
97 と \fBgetservbyname\fP(3) の機能をまとめて一つのインターフェースにしたものであるが、 これらの関数と違い、
98 \fBgetaddrinfo\fP() はリエントラントであり、 \fBgetaddrinfo\fP() を使うことでプログラムは IPv4 と IPv6
99 の違いに関する依存関係を なくすことができる。
100 .PP
101 \fBgetaddrinfo\fP()  が用いる \fIaddrinfo\fP 構造体は以下のフィールドを含む。
102 .sp
103 .in +4n
104 .nf
105 struct addrinfo {
106     int              ai_flags;
107     int              ai_family;
108     int              ai_socktype;
109     int              ai_protocol;
110     socklen_t        ai_addrlen;
111     struct sockaddr *ai_addr;
112     char            *ai_canonname;
113     struct addrinfo *ai_next;
114 };
115 .fi
116 .in
117 .PP
118 \fIhints\fP 引き数は \fIaddrinfo\fP 構造体を指し示し、この構造体を用いて \fIres\fP
119 が指すリストに入れて返すソケットアドレス構造体を選択するための基準を指定する。 \fIhints\fP が NULL でない場合、 \fIhints\fP は
120 \fIaddrinfo\fP 構造体を指し示し、その構造体のフィールド \fIai_family\fP, \fIai_socktype\fP,
121 \fIai_protocol\fP で \fBgetaddrinfo\fP()  が返すソケットアドレス集合に対する基準を指定する。
122 .TP  12
123 \fIai_family\fP
124 このフィールドは返されるアドレスの希望のアドレスファミリーを指定する。 このフィールドに指定できる有効な値としては \fBAF_INET\fP と
125 \fBAF_INET6\fP がある。 また、値 \fBAF_UNSPEC\fP を指定すると、 \fBgetaddrinfo\fP()  は \fInode\fP と
126 \fIservice\fP で使用できるいずれかのアドレスファミリー (例えば IPv4 か IPv6) の ソケットアドレスを返すことを求められる。
127 .TP 
128 \fIai_socktype\fP
129 このフィールドは推奨のソケット型 (例えば \fBSOCK_STREAM\fP や \fBSOCK_DGRAM\fP)  を指定する。 このフィールドに 0
130 を指定すると、任意のソケット型のソケットアドレスを \fBgetaddrinfo\fP()  が返してよいことを意味する。
131 .TP 
132 \fIai_protocol\fP
133 このフィールドは返されるソケットアドレスのプロトコルを指定する。 このフィールドに 0 を指定すると、任意のプロトコルののソケットアドレスを
134 \fBgetaddrinfo\fP()  が返してよいことを意味する。
135 .TP 
136 \fIai_flags\fP
137 このフィールドは、追加のオプション (下記) を指定する。 複数のフラグを指定する際には、それらのビット単位の OR をとって指定する。
138 .PP
139 \fIhints\fP が指し示す構造体の他のすべてのフィールドには 0 か NULL ポインタを適切に入れなければならない。 \fIhints\fP に NULL
140 を指定するのは、 \fIai_socktype\fP と \fIai_protocol\fP に 0 を、 \fIai_family\fP に \fBAF_UNSPEC\fP
141 を、 \fIai_flags\fP に \fB(AI_V4MAPPED\ |\ AI_ADDRCONFIG)\fP を設定するのと等価である。
142
143 \fInode\fP には、数値形式のネットワークアドレス (IPv4 の場合は \fBinet_aton\fP(3)
144 でサポートされているドット区切りの数字による表記、 IPv6 の場合は \fBinet_pton\fP(3)  でサポートされている 16 進数の文字列形式)
145 もしくは ネットワークホスト名を指定する。 ネットワークホスト名を指定した場合には、そのネットワークアドレスが検索され、 名前解決が行なわれる。
146 \fIhints.ai_flags\fP に \fBAI_NUMERICHOST\fP フラグが含まれている場合は、 \fInode\fP
147 は数値形式のネットワークアドレスでなければならない。 \fBAI_NUMERICHOST\fP
148 フラグを使うと、時間の掛かる可能性のあるネットワークホストアドレスの検索は すべて抑制される。
149 .PP
150 \fIhints.ai_flags\fP に \fBAI_PASSIVE\fP フラグが指定され、かつ \fInode\fP が NULL の場合、
151 返されるソケットアドレスは コネクションを \fBaccept\fP(2)  するためのソケットを \fBbind\fP(2)  するのに適したものとなる。
152 返されるソケットアドレスには「ワイルドカード・アドレス」 (IPv4 アドレスの場合は \fBINADDR_ANY\fP、 IPv6 アドレスの場合は
153 \fBIN6ADDR_ANY_INIT\fP)  が入る。 ワイルドカード・アドレスは、任意のホストのネットワークアドレスで接続を
154 受け付けようとするアプリケーション (通常はサーバー) で用いられる。 \fInode\fP が NULL でない場合、 \fBAI_PASSIVE\fP
155 フラグは無視される。
156 .PP
157 \fIhints.ai_flags\fP に \fBAI_PASSIVE\fP フラグがセットされていない場合、 返されるソケットアドレスは
158 \fBconnect\fP(2), \fBsendto\fP(2), \fBsendmsg\fP(2)  での使用に適したものとなる。 \fInode\fP が NULL
159 の場合、ネットワークアドレスにはループバック・インターフェイスの アドレス (IPv4 アドレスの場合は \fBINADDR_LOOPBACK\fP IPv6
160 アドレスの場合は \fBIN6ADDR_LOOPBACK_INIT\fP)\fBが設定される。\fP これは同じホスト上で動作している接続相手と通信するような
161 アプリケーションで用いられる。
162 .PP
163 \fIservice\fP により、返される各アドレス構造体のポート番号が決まる。 この引き数がサービス名 (\fBservices\fP(5)  参照)
164 の場合、対応するポート番号に翻訳される。 この引き数には 10 進数も指定することができ、 この場合にはバイナリへの変換だけが行われる。
165 \fIservice\fP が NULL の場合、返されるソケットアドレスのポート番号は 初期化されないままとなる。 \fIhints.ai_flags\fP に
166 \fBAI_NUMERICSERV\fP が指定され、かつ \fIservice\fP が NULL でない場合、 \fIservice\fP
167 は数値のポート番号を含む文字列を指し示さなければならない。 このフラグは、名前解決サービスが不要であることが分かっている場合に、
168 サービスの起動を抑制するために用いられる。
169 .PP
170 \fInode\fP と \fIservice\fP のどちらかは NULL にしてよいが、両方同時に NULL にしてはならない。
171 .PP
172 \fBgetaddrinfo\fP()  関数は、 \fIaddrinfo\fP 構造体のメモリ確保を行い、 \fIaddrinfo\fP
173 構造体のリンクリストを初期化し、 \fIres\fP にリストの先頭へのポインタを入れて返す。 このとき、各構造体のネットワークアドレスは \fInode\fP と
174 \fIservice\fP に一致し、 \fIhints\fP で課されたすべての制限を満たすものとなる。 リンクリストの要素は \fIai_next\fP
175 フィールドにより連結される。
176
177 リンクリストの \fIaddrinfo\fP 構造体は複数個になることもあり、その理由はいくつかある。 ネットワークホストがマルチホームである、
178 複数のプロトコルでアクセスできる (例えば \fBAF_INET\fP と \fBAF_INET6\fP の両方) 、 複数のソケット種別で同じサービスが利用できる
179 (例えば、ひとつが \fBSOCK_STREM\fP アドレスで、もうひとつが \fBSOCK_DGRAM\fP アドレスである)、がある。
180 通常は、アプリケーションは返された順序でアドレスを試すべきである。 \fBgetaddrinfo\fP()  の中で使用される並べ替え関数は RFC\ 3484 で定義されている。 特殊なシステムでは、 \fI/etc/gai.conf\fP を編集することで、この順序を微調整することができる
181 (\fI/etc/gai.conf\fP は glibc 2.5 以降で利用できる)。
182 .PP
183 .\" In glibc prior to 2.3.4, the ai_canonname of each addrinfo
184 .\" structure was set pointing to the canonical name; that was
185 .\" more than POSIX.1-2001 specified, or other implementations provided.
186 .\" MTK, Aug 05
187 \fIhints.ai_flags\fP に \fBAI_CANONNAME\fP フラグが含まれている場合、返されるリストの最初の \fIaddrinfo\fP
188 構造体の \fIai_canonname\fP フィールドはホストの公式な名前を指すように設定される。
189
190 返される各々の \fIaddrinfo\fP 構造体の残りのフィールドは以下のように初期化される。
191 .IP * 2
192 \fIai_family\fP, \fIai_socktype\fP, \fIai_protocol\fP フィールドはソケット生成パラメータを返す
193 (これらのフィールドの意味は \fBsocket\fP(2)  の同じ名前の引き数と同じである)。 例えば、 \fIai_family\fP は
194 \fBAF_INET\fP や \fBAF_INET6\fP を返し、 \fIai_socktype\fP は \fBSOCK_DGRAM\fP や
195 \fBSOCK_STREAM\fP を返し、 \fIai_protocol\fP はそのソケットのプロトコルを返す。
196 .IP *
197 \fIai_addr\fP フィールドにはソケットアドレスへのポインタが書き込まれ、 \fIai_addrlen\fP
198 フィールドにはソケットアドレスの長さがバイト単位で書き込まれる。
199 .PP
200 \fIhints.ai_flags\fP が \fBAI_ADDRCONFIG\fP を含む場合、 \fIres\fP が指すリスト
201 には、ローカルシステムに最低一つの IPv4 アドレスが設定されている場合のみ
202 IPv4 アドレスが返され、 ローカルシステムに最低一つの IPv6 アドレスが
203 設定されている場合にのみ IPv6 アドレスが返される。なお、この場合には、
204 ループバックアドレスは有効に設定されたアドレスとはみなされない。
205 .PP
206 \fIhints.ai_flags\fP に \fBAI_V4MAPPED\fP が指定されていて、 \fIhints.ai_family\fP に
207 \fBAF_INET6\fP が指定され、 マッチする IPv6 アドレスが見つからなかった場合、 \fIres\fP が指すリストには IPv4\-mapped
208 IPv6 アドレスが返される。 \fIhints.ai_flags\fP に \fBAI_V4MAPPED\fP と \fBAI_ALL\fP
209 の両方が指定されている場合、 \fIres\fP が指すリストには IPv6 アドレスと IPv4\-mapped IPv6 アドレスの 両方が返される。
210 \fBAI_V4MAPPED\fP が指定されていない場合、 \fBAI_ALL\fP は無視される。
211 .PP
212 \fBfreeaddrinfo\fP()  関数は、 リンクリスト \fIres\fP に対して動的に割り当てられたメモリを解放する。
213 .SS "国際化ドメイン名のための getaddrinfo() の拡張"
214 .PP
215 glibc 2.3.4 から、 \fBgetaddrinfo\fP()  は入出力するホスト名を透過的に国際化ドメイン名 (IDN) 形式 (RFC 3490
216 の \fIInternationalizing Domain Names in Applications (IDNA)\fP を参照のこと)
217 と変換することを選択的に認めるように拡張されている。 4 つの新しいフラグが定義されている:
218 .TP 
219 \fBAI_IDN\fP
220 このフラグが指定されると、 \fInode\fP で与えられたノード名は必要があれば IDN 形式に変換される。
221 ソース符号化形式は現在のロケールのものである。
222
223 .\" Implementation Detail:
224 .\" To minimize effects on system performance the implementation might
225 .\" want to check whether the input string contains any non-ASCII
226 .\" characters.  If there are none the IDN step can be skipped completely.
227 .\" On systems which allow not-ASCII safe encodings for a locale this
228 .\" might be a problem.
229 入力名に非 ASCII 文字が含まれている場合、 IDN 符号化形式が使われる。 非 ASCII
230 文字が含まれている(ピリオドで区切られる)部分ノード名は、 名前解決機能に渡される前に ASCII 互換符号化形式 (ACE) を使って 符号化される。
231 .TP 
232 \fBAI_CANONIDN\fP
233 \fBAI_CANONNAME\fP が指定されている場合、 \fBgetaddrinfo\fP()  は名前の検索に成功した後、 返された \fIaddrinfo\fP
234 構造体に対応するノードの正規名を返す。 返り値は名前解決機能から返された値の正確なコピーである。
235
236 .\"
237 .\"Implementation Detail:
238 .\"If no component of the returned name starts with xn\-\- the IDN
239 .\"step can be skipped, therefore avoiding unnecessary slowdowns.
240 \fBAI_CANONIDN\fP 名前が ACE で符号化されている場合、一つまたは複数の名前の構成要素の先頭に \fIxn\-\-\fP を含んでいる。
241 これらの構成要素を読み込み可能な形に変換するために、 \fBAI_CANONNAME\fP と共に \fBAI_CANONIDN\fP フラグを渡すことも出来る。
242 返される文字列は現在のロケールの符号化形式で符号化されている。
243 .TP 
244 \fBAI_IDN_ALLOW_UNASSIGNED\fP, \fBAI_IDN_USE_STD3_ASCII_RULES\fP
245 これらのフラグをセットすると、IDNA 処理で使用されるフラグ IDNA_ALLOW_UNASSIGNED (未割り当ての Unicode
246 のコードポイントを許容) と IDNA_USE_STD3_ASCII_RULES (出力が STD3 準拠のホスト名かをチェックする)
247 がそれぞれ有効になる。
248 .SH 返り値
249 .\" FIXME glibc defines the following additional errors, some which
250 .\" can probably be returned by getaddrinfo(); they need to
251 .\" be documented.
252 .\" #ifdef __USE_GNU
253 .\" #define EAI_INPROGRESS  -100  /* Processing request in progress.  */
254 .\" #define EAI_CANCELED    -101  /* Request canceled.  */
255 .\" #define EAI_NOTCANCELED -102  /* Request not canceled.  */
256 .\" #define EAI_ALLDONE     -103  /* All requests done.  */
257 .\" #define EAI_INTR        -104  /* Interrupted by a signal.  */
258 .\" #define EAI_IDN_ENCODE  -105  /* IDN encoding failed.  */
259 .\" #endif
260 \fBgetaddrinfo\fP()  は成功すると 0 を返し、失敗すると以下の非 0 のエラーコードのいずれかを返す。
261 .TP 
262 \fBEAI_ADDRFAMILY\fP
263 .\" Not in SUSv3
264 指定されたネットワークホストには、 要求されたアドレスファミリーのネットワークアドレスがない。
265 .TP 
266 \fBEAI_AGAIN\fP
267 ネームサーバーから一時的な失敗 (temporary failure)  を意味する返事が返された。後でもう一度試してみよ。
268 .TP 
269 \fBEAI_BADFLAGS\fP
270 \fIhints.ai_flags\fP のフラグに不正なフラグが含まれている。または、 \fIhints.ai_flags\fP に
271 \fBAI_CANONNAME\fP が含まれていて、かつ \fIname\fP が NULL であった。
272 .TP 
273 \fBEAI_FAIL\fP
274 ネームサーバーから恒久的な失敗 (permanent failure)  を意味する返事が返された。
275 .TP 
276 \fBEAI_FAMILY\fP
277 要求されたアドレスファミリーがサポートされていない。
278 .TP 
279 \fBEAI_MEMORY\fP
280 メモリが足りない。
281 .TP 
282 \fBEAI_NODATA\fP
283 .\" Not in SUSv3
284 指定されたネットワークホストは存在するが、 ネットワークアドレスがひとつも定義されていない。
285 .TP 
286 \fBEAI_NONAME\fP
287 \fInode\fP と \fIservice\fP のどちらかが不明、または \fInode\fP と \fIservice\fP の両方が NULL だった場合、または
288 \fBAI_NUMERICSERV\fP が \fIhints.ai_flags\fP に指定されていて、 \fIhints.ai_flags\fP と
289 \fIservice\fP が数値のポート番号の文字列でない。
290 .TP 
291 \fBEAI_SERVICE\fP
292 要求されたサービスは、要求されたソケットタイプでは利用できない。 他のソケットタイプでなら利用可能かもしれない。 このエラーが発生する例としては、
293 \fIservice\fP が "shell" (ストリーム・ソケットでのみ利用できるサービス) で、 \fIhints.ai_protocol\fP に
294 \fBIPPROTO_UDP\fP が指定されたり、 \fIhints.ai_socktype\fP に \fBSOCK_DGRAM\fP が指定されたりした場合がある。
295 また、 \fIservice\fP が NULL 以外で、 \fIhints.ai_socktype\fP に \fBSOCK_RAW\fP
296 (サービスの考え方をサポートしていないソケット種別)  が指定された場合にも、このエラーが発生する。
297 .TP 
298 \fBEAI_SOCKTYPE\fP
299 要求されたソケットタイプがサポートされていない。 このエラーが発生する例としては、 \fIhints.ai_socktype\fP と
300 \fIhints.ai_protocol\fP が矛盾している場合 (例えば \fIhints.ai_socktype\fP が \fBSOCK_DGRAM\fP で
301 \fIhints.ai_protocol\fP が \fBIPPROTO_TCP\fP)  がある。
302 .TP 
303 \fBEAI_SYSTEM\fP
304 その他のシステムエラー。詳しくは \fIerrno\fP を調べること。
305 .PP
306 \fBgai_strerror\fP()  関数を用いると、これらのエラーコードを人間に可読な文字列に変換できるので、 エラー報告に適するだろう。
307 .SH ファイル
308 \fI/etc/gai.conf\fP
309 .SH 準拠
310 POSIX.1\-2001.  \fBgetaddrinfo\fP()  関数は RFC 2553 に記載されている。
311 .SH 注意
312 \fBgetaddrinfo\fP()  は、IPv6 scope\-ID を指定するために \fIaddress\fP\fB%\fP\fIscope\-id\fP
313 記法をサポートしている。
314
315 \fBAI_ADDRCONFIG\fP, \fBAI_ALL\fP, \fBAI_V4MAPPED\fP は glibc 2.3.3 以降で利用可能である。
316 \fBAI_NUMERICSERV\fP は glibc 2.3.4 以降で利用可能である。
317
318 POSIX.1\-2001 によると、 \fIhints\fP に NULL が指定された場合、 \fIai_flags\fP を 0 とみなすべきとされている。
319 GNU C ライブラリでは、この場合に、代わりに \fIai_flags\fP を \fB(AI_V4MAPPED\ |\ AI_ADDRCONFIG)\fP
320 とみなすようになっている。 この値の方が標準規格の改善になると考えられているからである。
321 .SH 例
322 .\" getnameinfo.3 refers to this example
323 .\" socket.2 refers to this example
324 .\" bind.2 refers to this example
325 .\" connect.2 refers to this example
326 .\" recvfrom.2 refers to this example
327 .\" sendto.2 refers to this example
328 以下のプログラムは、 \fBgetaddrinfo\fP(), \fBgai_strerror\fP(), \fBfreeaddrinfo\fP(),
329 \fBgetnameinfo\fP(3)  の使い方を示したものである。 プログラムは UDP データグラムの echo サーバとクライアントである。
330 .SS サーバのプログラム
331 \&
332 .nf
333 #include <sys/types.h>
334 #include <stdio.h>
335 #include <stdlib.h> 
336 #include <unistd.h>
337 #include <string.h>
338 #include <sys/socket.h>
339 #include <netdb.h>
340
341 #define BUF_SIZE 500
342
343 int
344 main(int argc, char *argv[])
345 {
346     struct addrinfo hints;
347     struct addrinfo *result, *rp;
348     int sfd, s;
349     struct sockaddr_storage peer_addr;
350     socklen_t peer_addr_len;
351     ssize_t nread;
352     char buf[BUF_SIZE];
353
354     if (argc != 2) {
355         fprintf(stderr, "Usage: %s port\en", argv[0]);
356         exit(EXIT_FAILURE);
357     }
358
359     memset(&hints, 0, sizeof(struct addrinfo));
360     hints.ai_family = AF_UNSPEC;    /* Allow IPv4 or IPv6 */
361     hints.ai_socktype = SOCK_DGRAM; /* Datagram socket */
362     hints.ai_flags = AI_PASSIVE;    /* For wildcard IP address */
363     hints.ai_protocol = 0;          /* Any protocol */
364     hints.ai_canonname = NULL;
365     hints.ai_addr = NULL;
366     hints.ai_next = NULL;
367
368     s = getaddrinfo(NULL, argv[1], &hints, &result);
369     if (s != 0) {
370         fprintf(stderr, "getaddrinfo: %s\en", gai_strerror(s));
371         exit(EXIT_FAILURE);
372     }
373
374     /* getaddrinfo() returns a list of address structures.
375        Try each address until we successfully bind(2).
376        If socket(2) (or bind(2)) fails, we (close the socket
377        and) try the next address. */
378
379     for (rp = result; rp != NULL; rp = rp\->ai_next) {
380         sfd = socket(rp\->ai_family, rp\->ai_socktype,
381                 rp\->ai_protocol);
382         if (sfd == \-1)
383             continue;
384
385         if (bind(sfd, rp\->ai_addr, rp\->ai_addrlen) == 0)
386             break;                  /* Success */
387
388         close(sfd);
389     }
390
391     if (rp == NULL) {               /* No address succeeded */
392         fprintf(stderr, "Could not bind\en");
393         exit(EXIT_FAILURE);
394     }
395
396     freeaddrinfo(result);           /* No longer needed */
397
398     /* Read datagrams and echo them back to sender */
399
400     for (;;) {
401         peer_addr_len = sizeof(struct sockaddr_storage);
402         nread = recvfrom(sfd, buf, BUF_SIZE, 0,
403                 (struct sockaddr *) &peer_addr, &peer_addr_len);
404         if (nread == \-1)
405             continue;               /* Ignore failed request */
406
407         char host[NI_MAXHOST], service[NI_MAXSERV];
408
409         s = getnameinfo((struct sockaddr *) &peer_addr,
410                         peer_addr_len, host, NI_MAXHOST,
411                         service, NI_MAXSERV, NI_NUMERICSERV);
412        if (s == 0)
413             printf("Received %ld bytes from %s:%s\en",
414                     (long) nread, host, service);
415         else
416             fprintf(stderr, "getnameinfo: %s\en", gai_strerror(s));
417
418         if (sendto(sfd, buf, nread, 0,
419                     (struct sockaddr *) &peer_addr,
420                     peer_addr_len) != nread)
421             fprintf(stderr, "Error sending response\en");
422     }
423 }
424 .fi
425 .SS クライアントのプログラム
426 \&
427 .nf
428 #include <sys/types.h>
429 #include <sys/socket.h>
430 #include <netdb.h>
431 #include <stdio.h>
432 #include <stdlib.h>
433 #include <unistd.h>
434 #include <string.h>
435
436 #define BUF_SIZE 500
437
438 int
439 main(int argc, char *argv[])
440 {
441     struct addrinfo hints;
442     struct addrinfo *result, *rp;
443     int sfd, s, j;
444     size_t len;
445     ssize_t nread;
446     char buf[BUF_SIZE];
447
448     if (argc < 3) {
449         fprintf(stderr, "Usage: %s host port msg...\en", argv[0]);
450         exit(EXIT_FAILURE);
451     }
452
453     /* Obtain address(es) matching host/port */
454
455     memset(&hints, 0, sizeof(struct addrinfo));
456     hints.ai_family = AF_UNSPEC;    /* Allow IPv4 or IPv6 */
457     hints.ai_socktype = SOCK_DGRAM; /* Datagram socket */
458     hints.ai_flags = 0;
459     hints.ai_protocol = 0;          /* Any protocol */
460
461     s = getaddrinfo(argv[1], argv[2], &hints, &result);
462     if (s != 0) {
463         fprintf(stderr, "getaddrinfo: %s\en", gai_strerror(s));
464         exit(EXIT_FAILURE);
465     }
466
467     /* getaddrinfo() returns a list of address structures.
468        Try each address until we successfully connect(2).
469        If socket(2) (or connect(2)) fails, we (close the socket
470        and) try the next address. */
471
472     for (rp = result; rp != NULL; rp = rp\->ai_next) {
473         sfd = socket(rp\->ai_family, rp\->ai_socktype,
474                      rp\->ai_protocol);
475         if (sfd == \-1)
476             continue;
477
478         if (connect(sfd, rp\->ai_addr, rp\->ai_addrlen) != \-1)
479             break;                  /* Success */
480
481         close(sfd);
482     }
483
484     if (rp == NULL) {               /* No address succeeded */
485         fprintf(stderr, "Could not connect\en");
486         exit(EXIT_FAILURE);
487     }
488
489     freeaddrinfo(result);           /* No longer needed */
490
491     /* Send remaining command\-line arguments as separate
492        datagrams, and read responses from server */
493
494     for (j = 3; j < argc; j++) {
495         len = strlen(argv[j]) + 1;
496                 /* +1 for terminating null byte */
497
498         if (len + 1 > BUF_SIZE) {
499             fprintf(stderr,
500                     "Ignoring long message in argument %d\en", j);
501             continue;
502         }
503
504         if (write(sfd, argv[j], len) != len) {
505             fprintf(stderr, "partial/failed write\en");
506             exit(EXIT_FAILURE);
507         }
508
509         nread = read(sfd, buf, BUF_SIZE);
510         if (nread == \-1) {
511             perror("read");
512             exit(EXIT_FAILURE);
513         }
514
515         printf("Received %ld bytes: %s\en", (long) nread, buf);
516     }
517
518     exit(EXIT_SUCCESS);
519 }
520 .fi
521 .SH 関連項目
522 .\" .BR getipnodebyaddr (3),
523 .\" .BR getipnodebyname (3),
524 \fBgetaddrinfo_a\fP(3), \fBgethostbyname\fP(3), \fBgetnameinfo\fP(3), \fBinet\fP(3),
525 \fBgai.conf\fP(5), \fBhostname\fP(7), \fBip\fP(7)
526 .SH この文書について
527 この man ページは Linux \fIman\-pages\fP プロジェクトのリリース 3.53 の一部
528 である。プロジェクトの説明とバグ報告に関する情報は
529 http://www.kernel.org/doc/man\-pages/ に書かれている。