File: getaddrinfo.3

package info (click to toggle)
manpages-ja 0.5.0.0.20210215%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 28,568 kB
  • sloc: perl: 161; makefile: 58
file content (530 lines) | stat: -rw-r--r-- 27,948 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
.\" Copyright (c) 2007, 2008 Michael Kerrisk <mtk.manpages@gmail.com>
.\" and Copyright (c) 2006 Ulrich Drepper <drepper@redhat.com>
.\" A few pieces of an earlier version remain:
.\" Copyright 2000, Sam Varshavchik <mrsam@courier-mta.com>
.\"
.\" %%%LICENSE_START(VERBATIM)
.\" Permission is granted to make and distribute verbatim copies of this
.\" manual provided the copyright notice and this permission notice are
.\" preserved on all copies.
.\"
.\" Permission is granted to copy and distribute modified versions of this
.\" manual under the conditions for verbatim copying, provided that the
.\" entire resulting derived work is distributed under the terms of a
.\" permission notice identical to this one.
.\"
.\" Since the Linux kernel and libraries are constantly changing, this
.\" manual page may be incorrect or out-of-date.  The author(s) assume no
.\" responsibility for errors or omissions, or for damages resulting from
.\" the use of the information contained herein.  The author(s) may not
.\" have taken the same level of care in the production of this manual,
.\" which is licensed free of charge, as they might when working
.\" professionally.
.\"
.\" Formatted or processed versions of this manual, if unaccompanied by
.\" the source, must acknowledge the copyright and authors of this work.
.\" %%%LICENSE_END
.\"
.\" References: RFC 2553
.\"
.\" 2005-08-09, mtk, added AI_ALL, AI_ADDRCONFIG, AI_V4MAPPED,
.\"			and AI_NUMERICSERV.
.\" 2006-11-25, Ulrich Drepper <drepper@redhat.com>
.\"     Add text describing Internationalized Domain Name extensions.
.\" 2007-06-08, mtk: added example programs
.\" 2008-02-26, mtk; clarify discussion of NULL 'hints' argument; other
.\"     minor rewrites.
.\" 2008-06-18, mtk: many parts rewritten
.\" 2008-12-04, Petr Baudis <pasky@suse.cz>
.\"	Describe results ordering and reference /etc/gai.conf.
.\"
.\" FIXME . glibc's 2.9 NEWS file documents DCCP and UDP-lite support
.\"           and is SCTP support now also there?
.\"
.\"*******************************************************************
.\"
.\" This file was generated with po4a. Translate the source file.
.\"
.\"*******************************************************************
.\"
.\" Japanese Version Copyright (c) 2001 NAKANO Takeo all rights reserved.
.\" Translated Sun Jan 14 2001 by NAKANO Takeo <nakano@apm.seikei.ac.jp>
.\" Updated 2005-10-09 by Kentaro Shirakata <argrath@ub32.org>
.\" Updated 2007-01-01 by Kentaro Shirakata <argrath@ub32.org>
.\" Updated 2007-06-13, Akihiro MOTOKI <amotoki@dd.iij4u.or.jp>, LDP v2.55
.\" Updated 2008-04-04, Akihiro MOTOKI, LDP v2.79
.\" Updated 2008-08-11, Akihiro MOTOKI, LDP v3.05
.\" Updated 2008-11-09, Akihiro MOTOKI, LDP v3.13
.\" Updated 2008-12-26, Akihiro MOTOKI, LDP v3.15
.\" Updated 2010-04-18, Akihiro MOTOKI, LDP v3.24
.\" Updated 2012-04-30, Akihiro MOTOKI <amotoki@gmail.com>
.\" Updated 2012-05-29, Akihiro MOTOKI <amotoki@gmail.com>
.\" Updated 2013-05-01, Akihiro MOTOKI <amotoki@gmail.com>
.\"
.TH GETADDRINFO 3 2014\-04\-06 GNU "Linux Programmer's Manual"
.SH 名前
getaddrinfo, freeaddrinfo, gai_strerror \- ネットワークのアドレスとサービスを変換する
.SH 書式
.nf
\fB#include <sys/types.h>\fP
\fB#include <sys/socket.h>\fP
\fB#include <netdb.h>\fP
.sp
\fBint getaddrinfo(const char *\fP\fInode\fP\fB, const char *\fP\fIservice\fP\fB,\fP
\fB                const struct addrinfo *\fP\fIhints\fP\fB,\fP
\fB                struct addrinfo **\fP\fIres\fP\fB);\fP
.sp
\fBvoid freeaddrinfo(struct addrinfo *\fP\fIres\fP\fB);\fP
.sp
\fBconst char *gai_strerror(int \fP\fIerrcode\fP\fB);\fP
.fi
.sp
.in -4n
glibc 向けの機能検査マクロの要件 (\fBfeature_test_macros\fP(7)  参照):
.ad l
.in
.sp
\fBgetaddrinfo\fP(), \fBfreeaddrinfo\fP(), \fBgai_strerror\fP():
.RS 4
_POSIX_C_SOURCE\ >=\ 1 || _XOPEN_SOURCE || _POSIX_SOURCE
.RE
.ad b
.SH 説明
.\" .BR getipnodebyname (3),
.\" .BR getipnodebyaddr (3),
\fBgetaddrinfo\fP()  は、(インターネットのホストとサービスを識別する)  \fInode\fP と \fIservice\fP を渡すと、一つ以上の
\fIaddrinfo\fP 構造体を返す。それぞれの \fIaddrinfo\fP 構造体には、 \fBbind\fP(2)  や \fBconnect\fP(2)
を呼び出す際に指定できるインターネットアドレスが格納されている。 \fBgetaddrinfo\fP()  関数は、 \fBgethostbyname\fP(3)
と \fBgetservbyname\fP(3) の機能をまとめて一つのインターフェースにしたものであるが、 これらの関数と違い、
\fBgetaddrinfo\fP() はリエントラントであり、 \fBgetaddrinfo\fP() を使うことでプログラムは IPv4 と IPv6
の違いに関する依存関係を なくすことができる。
.PP
\fBgetaddrinfo\fP()  が用いる \fIaddrinfo\fP 構造体は以下のフィールドを含む。
.sp
.in +4n
.nf
struct addrinfo {
    int              ai_flags;
    int              ai_family;
    int              ai_socktype;
    int              ai_protocol;
    socklen_t        ai_addrlen;
    struct sockaddr *ai_addr;
    char            *ai_canonname;
    struct addrinfo *ai_next;
};
.fi
.in
.PP
\fIhints\fP 引き数は \fIaddrinfo\fP 構造体を指し示し、この構造体を用いて \fIres\fP
が指すリストに入れて返すソケットアドレス構造体を選択するための基準を指定する。 \fIhints\fP が NULL でない場合、 \fIhints\fP は
\fIaddrinfo\fP 構造体を指し示し、その構造体のフィールド \fIai_family\fP, \fIai_socktype\fP,
\fIai_protocol\fP で \fBgetaddrinfo\fP()  が返すソケットアドレス集合に対する基準を指定する。
.TP  12
\fIai_family\fP
このフィールドは返されるアドレスの希望のアドレスファミリーを指定する。 このフィールドに指定できる有効な値としては \fBAF_INET\fP と
\fBAF_INET6\fP がある。 また、値 \fBAF_UNSPEC\fP を指定すると、 \fBgetaddrinfo\fP()  は \fInode\fP と
\fIservice\fP で使用できるいずれかのアドレスファミリー (例えば IPv4 か IPv6) の ソケットアドレスを返すことを求められる。
.TP 
\fIai_socktype\fP
このフィールドは推奨のソケット型 (例えば \fBSOCK_STREAM\fP や \fBSOCK_DGRAM\fP)  を指定する。 このフィールドに 0
を指定すると、任意のソケット型のソケットアドレスを \fBgetaddrinfo\fP()  が返してよいことを意味する。
.TP 
\fIai_protocol\fP
このフィールドは返されるソケットアドレスのプロトコルを指定する。 このフィールドに 0 を指定すると、任意のプロトコルののソケットアドレスを
\fBgetaddrinfo\fP()  が返してよいことを意味する。
.TP 
\fIai_flags\fP
このフィールドは、追加のオプション (下記) を指定する。 複数のフラグを指定する際には、それらのビット単位の OR をとって指定する。
.PP
\fIhints\fP が指し示す構造体の他のすべてのフィールドには 0 かヌルポインターを適切に入れなければならない。
.PP
\fIhints\fP に NULL を指定するのは、 \fIai_socktype\fP と \fIai_protocol\fP に 0 を、 \fIai_family\fP
に \fBAF_UNSPEC\fP を、 \fIai_flags\fP に \fB(AI_V4MAPPED\ |\ AI_ADDRCONFIG)\fP
を設定するのと等価である (POSIX では \fIai_flags\fP には別のデフォルト値が規定されている; 「備考」を参照)。 \fInode\fP
には、数値形式のネットワークアドレス (IPv4 の場合は \fBinet_aton\fP(3)  でサポートされているドット区切りの数字による表記、
IPv6 の場合は \fBinet_pton\fP(3)  でサポートされている 16 進数の文字列形式) もしくは ネットワークホスト名を指定する。
ネットワークホスト名を指定した場合には、そのネットワークアドレスが検索され、 名前解決が行なわれる。 \fIhints.ai_flags\fP に
\fBAI_NUMERICHOST\fP フラグが含まれている場合は、 \fInode\fP は数値形式のネットワークアドレスでなければならない。
\fBAI_NUMERICHOST\fP フラグを使うと、時間の掛かる可能性のあるネットワークホストアドレスの検索は すべて抑制される。
.PP
\fIhints.ai_flags\fP に \fBAI_PASSIVE\fP フラグが指定され、かつ \fInode\fP が NULL の場合、
返されるソケットアドレスは コネクションを \fBaccept\fP(2)  するためのソケットを \fBbind\fP(2)  するのに適したものとなる。
返されるソケットアドレスには「ワイルドカードアドレス」 (IPv4 アドレスの場合は \fBINADDR_ANY\fP、 IPv6 アドレスの場合は
\fBIN6ADDR_ANY_INIT\fP)  が入る。 ワイルドカードアドレスは、任意のホストのネットワークアドレスで接続を
受け付けようとするアプリケーション (通常はサーバー) で用いられる。 \fInode\fP が NULL でない場合、 \fBAI_PASSIVE\fP
フラグは無視される。
.PP
\fIhints.ai_flags\fP に \fBAI_PASSIVE\fP フラグがセットされていない場合、 返されるソケットアドレスは
\fBconnect\fP(2), \fBsendto\fP(2), \fBsendmsg\fP(2)  での使用に適したものとなる。 \fInode\fP が NULL
の場合、ネットワークアドレスにはループバックインターフェイスの アドレス (IPv4 アドレスの場合は \fBINADDR_LOOPBACK\fP IPv6
アドレスの場合は \fBIN6ADDR_LOOPBACK_INIT\fP)\fBが設定される。\fP これは同じホスト上で動作している接続相手と通信するような
アプリケーションで用いられる。
.PP
\fIservice\fP により、返される各アドレス構造体のポート番号が決まる。 この引き数がサービス名 (\fBservices\fP(5)  参照)
の場合、対応するポート番号に翻訳される。 この引き数には 10 進数も指定することができ、 この場合にはバイナリへの変換だけが行われる。
\fIservice\fP が NULL の場合、返されるソケットアドレスのポート番号は 初期化されないままとなる。 \fIhints.ai_flags\fP に
\fBAI_NUMERICSERV\fP が指定され、かつ \fIservice\fP が NULL でない場合、 \fIservice\fP
は数値のポート番号を含む文字列を指し示さなければならない。 このフラグは、名前解決サービスが不要であることが分かっている場合に、
サービスの起動を抑制するために用いられる。
.PP
\fInode\fP と \fIservice\fP のどちらかは NULL にしてよいが、両方同時に NULL にしてはならない。
.PP
\fBgetaddrinfo\fP()  関数は、 \fIaddrinfo\fP 構造体のメモリー確保を行い、 \fIaddrinfo\fP
構造体のリンクリストを初期化し、 \fIres\fP にリストの先頭へのポインターを入れて返す。 このとき、各構造体のネットワークアドレスは \fInode\fP
と \fIservice\fP に一致し、 \fIhints\fP で課されたすべての制限を満たすものとなる。 リンクリストの要素は \fIai_next\fP
フィールドにより連結される。

リンクリストの \fIaddrinfo\fP 構造体は複数個になることもあり、その理由はいくつかある。 ネットワークホストがマルチホームである、
複数のプロトコルでアクセスできる (例えば \fBAF_INET\fP と \fBAF_INET6\fP の両方) 、 複数のソケット種別で同じサービスが利用できる
(例えば、ひとつが \fBSOCK_STREM\fP アドレスで、もうひとつが \fBSOCK_DGRAM\fP アドレスである)、がある。
通常は、アプリケーションは返された順序でアドレスを試すべきである。 \fBgetaddrinfo\fP()  の中で使用される並べ替え関数は RFC\ 3484 で定義されている。 特殊なシステムでは、 \fI/etc/gai.conf\fP を編集することで、この順序を微調整することができる
(\fI/etc/gai.conf\fP は glibc 2.5 以降で利用できる)。
.PP
.\" In glibc prior to 2.3.4, the ai_canonname of each addrinfo
.\" structure was set pointing to the canonical name; that was
.\" more than POSIX.1-2001 specified, or other implementations provided.
.\" MTK, Aug 05
\fIhints.ai_flags\fP に \fBAI_CANONNAME\fP フラグが含まれている場合、返されるリストの最初の \fIaddrinfo\fP
構造体の \fIai_canonname\fP フィールドはホストの公式な名前を指すように設定される。

返される各々の \fIaddrinfo\fP 構造体の残りのフィールドは以下のように初期化される。
.IP * 2
\fIai_family\fP, \fIai_socktype\fP, \fIai_protocol\fP フィールドはソケット生成パラメーターを返す
(これらのフィールドの意味は \fBsocket\fP(2)  の同じ名前の引き数と同じである)。 例えば、 \fIai_family\fP は
\fBAF_INET\fP や \fBAF_INET6\fP を返し、 \fIai_socktype\fP は \fBSOCK_DGRAM\fP や
\fBSOCK_STREAM\fP を返し、 \fIai_protocol\fP はそのソケットのプロトコルを返す。
.IP *
\fIai_addr\fP フィールドにはソケットアドレスへのポインターが書き込まれ、 \fIai_addrlen\fP
フィールドにはソケットアドレスの長さがバイト単位で書き込まれる。
.PP
\fIhints.ai_flags\fP が \fBAI_ADDRCONFIG\fP を含む場合、 \fIres\fP が指すリストには、ローカルシステムに最低一つの
IPv4 アドレスが設定されている場合のみ IPv4 アドレスが返され、 ローカルシステムに最低一つの IPv6 アドレスが設定されている場合にのみ
IPv6 アドレスが返される。 なお、この場合には、ループバックアドレスは有効に設定されたアドレスとはみなされない。 このフラグは、例えば、IPv4
だけのシステムで、 \fBgetaddrinfo\fP() が必ず IPv6 ソケットアドレスを返さないことを保証するのに役立つ。 IPv4
だけのシステムでは、IPv6 アドレスは \fBconnect\fP(2) や \fBbind\fP(2) で必ず失敗することになる。
.PP
\fIhints.ai_flags\fP に \fBAI_V4MAPPED\fP が指定されていて、 \fIhints.ai_family\fP に
\fBAF_INET6\fP が指定され、 マッチする IPv6 アドレスが見つからなかった場合、 \fIres\fP が指すリストには IPv4\-mapped
IPv6 アドレスが返される。 \fIhints.ai_flags\fP に \fBAI_V4MAPPED\fP と \fBAI_ALL\fP
の両方が指定されている場合、 \fIres\fP が指すリストには IPv6 アドレスと IPv4\-mapped IPv6 アドレスの 両方が返される。
\fBAI_V4MAPPED\fP が指定されていない場合、 \fBAI_ALL\fP は無視される。
.PP
\fBfreeaddrinfo\fP()  関数は、 リンクリスト \fIres\fP に対して動的に割り当てられたメモリーを解放する。
.SS "国際化ドメイン名のための getaddrinfo() の拡張"
.PP
glibc 2.3.4 から、 \fBgetaddrinfo\fP()  は入出力するホスト名を透過的に国際化ドメイン名 (IDN) 形式 (RFC 3490
の \fIInternationalizing Domain Names in Applications (IDNA)\fP を参照のこと)
と変換することを選択的に認めるように拡張されている。 4 つの新しいフラグが定義されている:
.TP 
\fBAI_IDN\fP
このフラグが指定されると、 \fInode\fP で与えられたノード名は必要があれば IDN 形式に変換される。
ソース符号化形式は現在のロケールのものである。

.\" Implementation Detail:
.\" To minimize effects on system performance the implementation might
.\" want to check whether the input string contains any non-ASCII
.\" characters.  If there are none the IDN step can be skipped completely.
.\" On systems which allow not-ASCII safe encodings for a locale this
.\" might be a problem.
入力名に非 ASCII 文字が含まれている場合、 IDN 符号化形式が使われる。 非 ASCII
文字が含まれている(ピリオドで区切られる)部分ノード名は、 名前解決機能に渡される前に ASCII 互換符号化形式 (ACE) を使って 符号化される。
.TP 
\fBAI_CANONIDN\fP
\fBAI_CANONNAME\fP が指定されている場合、 \fBgetaddrinfo\fP()  は名前の検索に成功した後、 返された \fIaddrinfo\fP
構造体に対応するノードの正規名を返す。 返り値は名前解決機能から返された値の正確なコピーである。

.\"
.\"Implementation Detail:
.\"If no component of the returned name starts with xn\-\- the IDN
.\"step can be skipped, therefore avoiding unnecessary slowdowns.
\fBAI_CANONIDN\fP 名前が ACE で符号化されている場合、一つまたは複数の名前の構成要素の先頭に \fIxn\-\-\fP を含んでいる。
これらの構成要素を読み込み可能な形に変換するために、 \fBAI_CANONNAME\fP と共に \fBAI_CANONIDN\fP フラグを渡すことも出来る。
返される文字列は現在のロケールの符号化形式で符号化されている。
.TP 
\fBAI_IDN_ALLOW_UNASSIGNED\fP, \fBAI_IDN_USE_STD3_ASCII_RULES\fP
これらのフラグをセットすると、IDNA 処理で使用されるフラグ IDNA_ALLOW_UNASSIGNED (未割り当ての Unicode
のコードポイントを許容) と IDNA_USE_STD3_ASCII_RULES (出力が STD3 準拠のホスト名かをチェックする)
がそれぞれ有効になる。
.SH 返り値
.\" FIXME glibc defines the following additional errors, some which
.\" can probably be returned by getaddrinfo(); they need to
.\" be documented.
.\" #ifdef __USE_GNU
.\" #define EAI_INPROGRESS  -100  /* Processing request in progress.  */
.\" #define EAI_CANCELED    -101  /* Request canceled.  */
.\" #define EAI_NOTCANCELED -102  /* Request not canceled.  */
.\" #define EAI_ALLDONE     -103  /* All requests done.  */
.\" #define EAI_INTR        -104  /* Interrupted by a signal.  */
.\" #define EAI_IDN_ENCODE  -105  /* IDN encoding failed.  */
.\" #endif
\fBgetaddrinfo\fP()  は成功すると 0 を返し、失敗すると以下の非 0 のエラーコードのいずれかを返す。
.TP 
\fBEAI_ADDRFAMILY\fP
.\" Not in SUSv3
指定されたネットワークホストには、 要求されたアドレスファミリーのネットワークアドレスがない。
.TP 
\fBEAI_AGAIN\fP
ネームサーバーから一時的な失敗 (temporary failure)  を意味する返事が返された。後でもう一度試してみよ。
.TP 
\fBEAI_BADFLAGS\fP
\fIhints.ai_flags\fP のフラグに不正なフラグが含まれている。または、 \fIhints.ai_flags\fP に
\fBAI_CANONNAME\fP が含まれていて、かつ \fIname\fP が NULL であった。
.TP 
\fBEAI_FAIL\fP
ネームサーバーから恒久的な失敗 (permanent failure)  を意味する返事が返された。
.TP 
\fBEAI_FAMILY\fP
要求されたアドレスファミリーがサポートされていない。
.TP 
\fBEAI_MEMORY\fP
メモリーが足りない。
.TP 
\fBEAI_NODATA\fP
.\" Not in SUSv3
指定されたネットワークホストは存在するが、 ネットワークアドレスがひとつも定義されていない。
.TP 
\fBEAI_NONAME\fP
\fInode\fP と \fIservice\fP のどちらかが不明、または \fInode\fP と \fIservice\fP の両方が NULL だった場合、または
\fBAI_NUMERICSERV\fP が \fIhints.ai_flags\fP に指定されていて、 \fIhints.ai_flags\fP と
\fIservice\fP が数値のポート番号の文字列でない。
.TP 
\fBEAI_SERVICE\fP
要求されたサービスは、要求されたソケットタイプでは利用できない。 他のソケットタイプでなら利用可能かもしれない。 このエラーが発生する例としては、
\fIservice\fP が "shell" (ストリームソケットでのみ利用できるサービス) で、 \fIhints.ai_protocol\fP に
\fBIPPROTO_UDP\fP が指定されたり、 \fIhints.ai_socktype\fP に \fBSOCK_DGRAM\fP が指定されたりした場合がある。
また、 \fIservice\fP が NULL 以外で、 \fIhints.ai_socktype\fP に \fBSOCK_RAW\fP
(サービスの考え方をサポートしていないソケット種別)  が指定された場合にも、このエラーが発生する。
.TP 
\fBEAI_SOCKTYPE\fP
要求されたソケットタイプがサポートされていない。 このエラーが発生する例としては、 \fIhints.ai_socktype\fP と
\fIhints.ai_protocol\fP が矛盾している場合 (例えば \fIhints.ai_socktype\fP が \fBSOCK_DGRAM\fP で
\fIhints.ai_protocol\fP が \fBIPPROTO_TCP\fP)  がある。
.TP 
\fBEAI_SYSTEM\fP
その他のシステムエラー。詳しくは \fIerrno\fP を調べること。
.PP
\fBgai_strerror\fP()  関数を用いると、これらのエラーコードを人間に可読な文字列に変換できるので、 エラー報告に適するだろう。
.SH ファイル
\fI/etc/gai.conf\fP
.SH 準拠
POSIX.1\-2001.  \fBgetaddrinfo\fP()  関数は RFC 2553 に記載されている。
.SH 注意
\fBgetaddrinfo\fP()  は、IPv6 scope\-ID を指定するために \fIaddress\fP\fB%\fP\fIscope\-id\fP
記法をサポートしている。

\fBAI_ADDRCONFIG\fP, \fBAI_ALL\fP, \fBAI_V4MAPPED\fP は glibc 2.3.3 以降で利用可能である。
\fBAI_NUMERICSERV\fP は glibc 2.3.4 以降で利用可能である。

POSIX.1\-2001 によると、 \fIhints\fP に NULL が指定された場合、 \fIai_flags\fP を 0 とみなすべきとされている。
GNU C ライブラリでは、この場合に、代わりに \fIai_flags\fP を \fB(AI_V4MAPPED\ |\ AI_ADDRCONFIG)\fP
とみなすようになっている。 この値の方が標準規格の改善になると考えられているからである。
.SH 例
.\" getnameinfo.3 refers to this example
.\" socket.2 refers to this example
.\" bind.2 refers to this example
.\" connect.2 refers to this example
.\" recvfrom.2 refers to this example
.\" sendto.2 refers to this example
以下のプログラムは、 \fBgetaddrinfo\fP(), \fBgai_strerror\fP(), \fBfreeaddrinfo\fP(),
\fBgetnameinfo\fP(3)  の使い方を示したものである。 プログラムは UDP データグラムの echo サーバとクライアントである。
.SS サーバのプログラム
\&
.nf
#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h> 
#include <unistd.h>
#include <string.h>
#include <sys/socket.h>
#include <netdb.h>

#define BUF_SIZE 500

int
main(int argc, char *argv[])
{
    struct addrinfo hints;
    struct addrinfo *result, *rp;
    int sfd, s;
    struct sockaddr_storage peer_addr;
    socklen_t peer_addr_len;
    ssize_t nread;
    char buf[BUF_SIZE];

    if (argc != 2) {
        fprintf(stderr, "Usage: %s port\en", argv[0]);
        exit(EXIT_FAILURE);
    }

    memset(&hints, 0, sizeof(struct addrinfo));
    hints.ai_family = AF_UNSPEC;    /* Allow IPv4 or IPv6 */
    hints.ai_socktype = SOCK_DGRAM; /* Datagram socket */
    hints.ai_flags = AI_PASSIVE;    /* For wildcard IP address */
    hints.ai_protocol = 0;          /* Any protocol */
    hints.ai_canonname = NULL;
    hints.ai_addr = NULL;
    hints.ai_next = NULL;

    s = getaddrinfo(NULL, argv[1], &hints, &result);
    if (s != 0) {
        fprintf(stderr, "getaddrinfo: %s\en", gai_strerror(s));
        exit(EXIT_FAILURE);
    }

    /* getaddrinfo() returns a list of address structures.
       Try each address until we successfully bind(2).
       If socket(2) (or bind(2)) fails, we (close the socket
       and) try the next address. */

    for (rp = result; rp != NULL; rp = rp\->ai_next) {
        sfd = socket(rp\->ai_family, rp\->ai_socktype,
                rp\->ai_protocol);
        if (sfd == \-1)
            continue;

        if (bind(sfd, rp\->ai_addr, rp\->ai_addrlen) == 0)
            break;                  /* Success */

        close(sfd);
    }

    if (rp == NULL) {               /* No address succeeded */
        fprintf(stderr, "Could not bind\en");
        exit(EXIT_FAILURE);
    }

    freeaddrinfo(result);           /* No longer needed */

    /* Read datagrams and echo them back to sender */

    for (;;) {
        peer_addr_len = sizeof(struct sockaddr_storage);
        nread = recvfrom(sfd, buf, BUF_SIZE, 0,
                (struct sockaddr *) &peer_addr, &peer_addr_len);
        if (nread == \-1)
            continue;               /* Ignore failed request */

        char host[NI_MAXHOST], service[NI_MAXSERV];

        s = getnameinfo((struct sockaddr *) &peer_addr,
                        peer_addr_len, host, NI_MAXHOST,
                        service, NI_MAXSERV, NI_NUMERICSERV);
       if (s == 0)
            printf("Received %zd bytes from %s:%s\en",
                    nread, host, service);
        else
            fprintf(stderr, "getnameinfo: %s\en", gai_strerror(s));

        if (sendto(sfd, buf, nread, 0,
                    (struct sockaddr *) &peer_addr,
                    peer_addr_len) != nread)
            fprintf(stderr, "Error sending response\en");
    }
}
.fi
.SS クライアントのプログラム
\&
.nf
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

#define BUF_SIZE 500

int
main(int argc, char *argv[])
{
    struct addrinfo hints;
    struct addrinfo *result, *rp;
    int sfd, s, j;
    size_t len;
    ssize_t nread;
    char buf[BUF_SIZE];

    if (argc < 3) {
        fprintf(stderr, "Usage: %s host port msg...\en", argv[0]);
        exit(EXIT_FAILURE);
    }

    /* Obtain address(es) matching host/port */

    memset(&hints, 0, sizeof(struct addrinfo));
    hints.ai_family = AF_UNSPEC;    /* Allow IPv4 or IPv6 */
    hints.ai_socktype = SOCK_DGRAM; /* Datagram socket */
    hints.ai_flags = 0;
    hints.ai_protocol = 0;          /* Any protocol */

    s = getaddrinfo(argv[1], argv[2], &hints, &result);
    if (s != 0) {
        fprintf(stderr, "getaddrinfo: %s\en", gai_strerror(s));
        exit(EXIT_FAILURE);
    }

    /* getaddrinfo() returns a list of address structures.
       Try each address until we successfully connect(2).
       If socket(2) (or connect(2)) fails, we (close the socket
       and) try the next address. */

    for (rp = result; rp != NULL; rp = rp\->ai_next) {
        sfd = socket(rp\->ai_family, rp\->ai_socktype,
                     rp\->ai_protocol);
        if (sfd == \-1)
            continue;

        if (connect(sfd, rp\->ai_addr, rp\->ai_addrlen) != \-1)
            break;                  /* Success */

        close(sfd);
    }

    if (rp == NULL) {               /* No address succeeded */
        fprintf(stderr, "Could not connect\en");
        exit(EXIT_FAILURE);
    }

    freeaddrinfo(result);           /* No longer needed */

    /* Send remaining command\-line arguments as separate
       datagrams, and read responses from server */

    for (j = 3; j < argc; j++) {
        len = strlen(argv[j]) + 1;
                /* +1 for terminating null byte */

        if (len + 1 > BUF_SIZE) {
            fprintf(stderr,
                    "Ignoring long message in argument %d\en", j);
            continue;
        }

        if (write(sfd, argv[j], len) != len) {
            fprintf(stderr, "partial/failed write\en");
            exit(EXIT_FAILURE);
        }

        nread = read(sfd, buf, BUF_SIZE);
        if (nread == \-1) {
            perror("read");
            exit(EXIT_FAILURE);
        }

        printf("Received %zd bytes: %s\en", nread, buf);
    }

    exit(EXIT_SUCCESS);
}
.fi
.SH 関連項目
.\" .BR getipnodebyaddr (3),
.\" .BR getipnodebyname (3),
\fBgetaddrinfo_a\fP(3), \fBgethostbyname\fP(3), \fBgetnameinfo\fP(3), \fBinet\fP(3),
\fBgai.conf\fP(5), \fBhostname\fP(7), \fBip\fP(7)
.SH この文書について
この man ページは Linux \fIman\-pages\fP プロジェクトのリリース 3.79 の一部
である。プロジェクトの説明とバグ報告に関する情報は
http://www.kernel.org/doc/man\-pages/ に書かれている。