2008-06-13 10:00:32 +00:00
|
|
|
.\" 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>
|
2004-11-03 13:51:07 +00:00
|
|
|
.\"
|
|
|
|
.\" 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.
|
2007-04-12 22:42:49 +00:00
|
|
|
.\"
|
2004-11-03 13:51:07 +00:00
|
|
|
.\" 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.
|
2007-04-12 22:42:49 +00:00
|
|
|
.\"
|
2004-11-03 13:51:07 +00:00
|
|
|
.\" Formatted or processed versions of this manual, if unaccompanied by
|
|
|
|
.\" the source, must acknowledge the copyright and authors of this work.
|
|
|
|
.\"
|
|
|
|
.\" References: RFC 2553
|
2005-08-09 11:40:12 +00:00
|
|
|
.\"
|
2007-04-12 22:42:49 +00:00
|
|
|
.\" 2005-08-09, mtk, added AI_ALL, AI_ADDRCONFIG, AI_V4MAPPED,
|
2005-08-09 11:40:12 +00:00
|
|
|
.\" and AI_NUMERICSERV.
|
2008-06-13 10:00:32 +00:00
|
|
|
.\" 2006-11-25, Ulrich Drepper <drepper@redhat.com>
|
|
|
|
.\" Add text describing Internationalized Domain Name extensions.
|
2007-05-28 10:30:10 +00:00
|
|
|
.\" 2007-06-08, mtk: added example programs
|
2008-02-26 08:27:51 +00:00
|
|
|
.\" 2008-02-26, mtk; clarify discussion of NULL 'hints' argument; other
|
|
|
|
.\" minor rewrites.
|
2008-06-13 10:00:32 +00:00
|
|
|
.\" 2008-06-18, mtk: many parts rewritten
|
2008-12-05 17:07:00 +00:00
|
|
|
.\" 2008-12-04, Petr Baudis <pasky@suse.cz>
|
|
|
|
.\" Describe results ordering and reference /etc/gai.conf.
|
2008-10-16 10:50:50 +00:00
|
|
|
.\" FIXME . glibc's 2.9 NEWS file documents DCCP and UDP-lite support
|
|
|
|
.\" and is SCTP support now also there?
|
2005-08-09 11:40:12 +00:00
|
|
|
.\"
|
2010-09-04 05:19:26 +00:00
|
|
|
.TH GETADDRINFO 3 2010-09-04 "GNU" "Linux Programmer's Manual"
|
2004-11-03 13:51:07 +00:00
|
|
|
.SH NAME
|
2008-06-13 10:00:32 +00:00
|
|
|
getaddrinfo, freeaddrinfo, gai_strerror \- network address and
|
|
|
|
service translation
|
2004-11-03 13:51:07 +00:00
|
|
|
.SH SYNOPSIS
|
|
|
|
.nf
|
|
|
|
.B #include <sys/types.h>
|
|
|
|
.B #include <sys/socket.h>
|
|
|
|
.B #include <netdb.h>
|
|
|
|
.sp
|
|
|
|
.BI "int getaddrinfo(const char *" "node" ", const char *" "service" ,
|
|
|
|
.BI " const struct addrinfo *" "hints" ,
|
|
|
|
.BI " struct addrinfo **" "res" );
|
|
|
|
.sp
|
|
|
|
.BI "void freeaddrinfo(struct addrinfo *" "res" );
|
|
|
|
.sp
|
|
|
|
.BI "const char *gai_strerror(int " "errcode" );
|
|
|
|
.fi
|
2008-08-29 15:50:13 +00:00
|
|
|
.sp
|
|
|
|
.in -4n
|
|
|
|
Feature Test Macro Requirements for glibc (see
|
|
|
|
.BR feature_test_macros (7)):
|
|
|
|
.ad l
|
|
|
|
.in
|
|
|
|
.sp
|
|
|
|
.BR getaddrinfo (),
|
|
|
|
.BR freeaddrinfo (),
|
|
|
|
.BR gai_strerror ():
|
2010-09-19 05:03:15 +00:00
|
|
|
.RS 4
|
2008-08-29 15:50:13 +00:00
|
|
|
_POSIX_C_SOURCE\ >=\ 1 || _XOPEN_SOURCE || _POSIX_SOURCE
|
2010-09-19 05:03:15 +00:00
|
|
|
.RE
|
2008-08-29 15:50:13 +00:00
|
|
|
.ad b
|
2004-11-03 13:51:07 +00:00
|
|
|
.SH DESCRIPTION
|
2008-02-26 08:27:51 +00:00
|
|
|
Given
|
|
|
|
.I node
|
|
|
|
and
|
|
|
|
.IR service ,
|
2008-06-13 10:00:32 +00:00
|
|
|
which identify an Internet host and a service,
|
2008-02-26 08:27:51 +00:00
|
|
|
.BR getaddrinfo ()
|
2008-06-13 10:00:32 +00:00
|
|
|
returns one or more
|
|
|
|
.I addrinfo
|
|
|
|
structures, each of which contains an Internet address
|
|
|
|
that can be specified in a call to
|
2008-02-26 08:27:51 +00:00
|
|
|
.BR bind (2)
|
2008-06-13 10:00:32 +00:00
|
|
|
or
|
|
|
|
.BR connect (2).
|
2004-11-03 13:51:07 +00:00
|
|
|
The
|
2007-11-24 10:10:39 +00:00
|
|
|
.BR getaddrinfo ()
|
2004-11-03 13:51:07 +00:00
|
|
|
function combines the functionality provided by the
|
2007-10-14 18:20:32 +00:00
|
|
|
.\" .BR getipnodebyname (3),
|
|
|
|
.\" .BR getipnodebyaddr (3),
|
2007-11-15 03:28:33 +00:00
|
|
|
.BR getservbyname (3)
|
2004-11-03 13:51:07 +00:00
|
|
|
and
|
|
|
|
.BR getservbyport (3)
|
2008-02-26 08:27:51 +00:00
|
|
|
functions into a single interface, but unlike the latter functions,
|
2007-11-24 10:10:39 +00:00
|
|
|
.BR getaddrinfo ()
|
2008-06-13 10:00:32 +00:00
|
|
|
is reentrant and allows programs to eliminate IPv4-versus-IPv6 dependencies.
|
2004-11-03 13:51:07 +00:00
|
|
|
.PP
|
|
|
|
The
|
2005-11-02 13:55:25 +00:00
|
|
|
.I addrinfo
|
2008-06-13 10:00:32 +00:00
|
|
|
structure used by
|
|
|
|
.BR getaddrinfo ()
|
|
|
|
contains the following fields:
|
2004-11-03 13:51:07 +00:00
|
|
|
.sp
|
2007-12-23 14:03:07 +00:00
|
|
|
.in +4n
|
2004-11-03 13:51:07 +00:00
|
|
|
.nf
|
2007-06-20 20:48:54 +00:00
|
|
|
struct addrinfo {
|
|
|
|
int ai_flags;
|
|
|
|
int ai_family;
|
|
|
|
int ai_socktype;
|
|
|
|
int ai_protocol;
|
|
|
|
size_t ai_addrlen;
|
|
|
|
struct sockaddr *ai_addr;
|
|
|
|
char *ai_canonname;
|
|
|
|
struct addrinfo *ai_next;
|
|
|
|
};
|
2004-11-03 13:51:07 +00:00
|
|
|
.fi
|
2007-12-23 14:03:07 +00:00
|
|
|
.in
|
2004-11-03 13:51:07 +00:00
|
|
|
.PP
|
|
|
|
The
|
|
|
|
.I hints
|
2008-06-13 10:00:32 +00:00
|
|
|
argument points to an
|
2008-02-26 08:27:51 +00:00
|
|
|
.I addrinfo
|
|
|
|
structure that specifies criteria for selecting the socket address
|
|
|
|
structures returned in the list pointed to by
|
|
|
|
.IR res .
|
2008-06-13 10:00:32 +00:00
|
|
|
If
|
|
|
|
.I hints
|
|
|
|
is not NULL it points to an
|
2005-11-02 13:55:25 +00:00
|
|
|
.I addrinfo
|
2008-06-13 10:00:32 +00:00
|
|
|
structure whose
|
2004-11-03 13:51:07 +00:00
|
|
|
.IR ai_family ,
|
|
|
|
.IR ai_socktype ,
|
|
|
|
and
|
|
|
|
.I ai_protocol
|
2008-06-13 10:00:32 +00:00
|
|
|
specify criteria that limit the set of socket addresses returned by
|
|
|
|
.BR getaddrinfo (),
|
|
|
|
as follows:
|
|
|
|
.TP 12
|
2004-11-03 13:51:07 +00:00
|
|
|
.I ai_family
|
2008-06-13 10:00:32 +00:00
|
|
|
This field specifies the desired address family for the returned addresses.
|
|
|
|
Valid values for this field include
|
|
|
|
.BR AF_INET
|
|
|
|
and
|
|
|
|
.BR AF_INET6 .
|
|
|
|
The value
|
|
|
|
.B AF_UNSPEC
|
|
|
|
indicates that
|
|
|
|
.BR getaddrinfo ()
|
|
|
|
should return socket addresses for any address family
|
|
|
|
(either IPv4 or IPv6, for example) that can be used with
|
|
|
|
.I node
|
|
|
|
and
|
|
|
|
.IR service .
|
|
|
|
.TP
|
2004-11-03 13:51:07 +00:00
|
|
|
.I ai_socktype
|
2008-06-13 10:00:32 +00:00
|
|
|
This field specifies the preferred socket type, for example
|
|
|
|
.BR SOCK_STREAM
|
2004-11-03 13:51:07 +00:00
|
|
|
or
|
2008-06-13 10:00:32 +00:00
|
|
|
.BR SOCK_DGRAM .
|
|
|
|
Specifying 0 in this field indicates that socket addresses of any type
|
|
|
|
can be returned by
|
|
|
|
.BR getaddrinfo ().
|
|
|
|
.TP
|
2004-11-03 13:51:07 +00:00
|
|
|
.I ai_protocol
|
2008-06-13 10:00:32 +00:00
|
|
|
This field specifies the protocol for the returned socket addresses.
|
|
|
|
Specifying 0 in this field indicates that socket addresses with
|
|
|
|
any protocol can be returned by
|
|
|
|
.BR getaddrinfo ().
|
|
|
|
.TP
|
2004-11-03 13:51:07 +00:00
|
|
|
.I ai_flags
|
2008-06-13 10:00:32 +00:00
|
|
|
This field specifies additional options, described below.
|
2010-06-26 09:21:14 +00:00
|
|
|
Multiple flags are specified by bitwise OR-ing them together.
|
2008-06-13 10:00:32 +00:00
|
|
|
.PP
|
|
|
|
All the other fields in the structure pointed to by
|
2004-11-03 13:51:07 +00:00
|
|
|
.I hints
|
2008-06-13 10:00:32 +00:00
|
|
|
must contain either 0 or a null pointer, as appropriate.
|
2008-02-26 08:27:51 +00:00
|
|
|
Specifying
|
|
|
|
.I hints
|
|
|
|
as NULL is equivalent to setting
|
|
|
|
.I ai_socktype
|
|
|
|
and
|
|
|
|
.I ai_protocol
|
|
|
|
to 0;
|
|
|
|
.I ai_family
|
|
|
|
to
|
|
|
|
.BR AF_UNSPEC ;
|
|
|
|
and
|
|
|
|
.I ai_flags
|
|
|
|
to
|
|
|
|
.BR "(AI_V4MAPPED\ |\ AI_ADDRCONFIG)" .
|
2008-06-13 10:00:32 +00:00
|
|
|
|
2004-11-03 13:51:07 +00:00
|
|
|
.I node
|
|
|
|
specifies either a numerical network address
|
2008-06-13 10:00:32 +00:00
|
|
|
(for IPv4, numbers-and-dots notation as supported by
|
|
|
|
.BR inet_aton (3);
|
|
|
|
for IPv6, hexadecimal string format as supported by
|
|
|
|
.BR inet_pton (3)),
|
2004-11-03 13:51:07 +00:00
|
|
|
or a network hostname, whose network addresses are looked up and resolved.
|
2005-08-09 11:40:12 +00:00
|
|
|
If
|
|
|
|
.I hints.ai_flags
|
|
|
|
contains the
|
2004-11-03 13:51:07 +00:00
|
|
|
.B AI_NUMERICHOST
|
2008-06-13 10:00:32 +00:00
|
|
|
flag then
|
2004-11-03 13:51:07 +00:00
|
|
|
.I node
|
2008-06-13 10:00:32 +00:00
|
|
|
must be a numerical network address.
|
2004-11-03 13:51:07 +00:00
|
|
|
The
|
|
|
|
.B AI_NUMERICHOST
|
|
|
|
flag suppresses any potentially lengthy network host address lookups.
|
|
|
|
.PP
|
2008-06-13 10:00:32 +00:00
|
|
|
If the
|
|
|
|
.B AI_PASSIVE
|
|
|
|
flag is specified in
|
|
|
|
.IR hints.ai_flags ,
|
|
|
|
and
|
|
|
|
.I node
|
|
|
|
is NULL,
|
|
|
|
then the returned socket addresses will be suitable for
|
|
|
|
.BR bind (2)ing
|
|
|
|
a socket that will
|
|
|
|
.BR accept (2)
|
|
|
|
connections.
|
|
|
|
The returned socket address will contain the "wildcard address"
|
|
|
|
.RB ( INADDR_ANY
|
|
|
|
for IPv4 addresses,
|
|
|
|
.BR IN6ADDR_ANY_INIT
|
|
|
|
for IPv6 address).
|
|
|
|
The wildcard address is used by applications (typically servers)
|
|
|
|
that intend to accept connections on any of the hosts's network addresses.
|
|
|
|
If
|
|
|
|
.I node
|
|
|
|
is not NULL, then the
|
2008-06-30 09:11:15 +00:00
|
|
|
.B AI_PASSIVE
|
2008-06-13 10:00:32 +00:00
|
|
|
flag is ignored.
|
|
|
|
.PP
|
|
|
|
If the
|
|
|
|
.B AI_PASSIVE
|
|
|
|
flag is not set in
|
|
|
|
.IR hints.ai_flags ,
|
|
|
|
then the returned socket addresses will be suitable for use with
|
|
|
|
.BR connect (2),
|
|
|
|
.BR sendto (2),
|
|
|
|
or
|
|
|
|
.BR sendmsg (2).
|
|
|
|
If
|
|
|
|
.I node
|
|
|
|
is NULL,
|
|
|
|
then the network address will be set to the loopback interface address
|
|
|
|
.RB ( INADDR_LOOPBACK
|
|
|
|
for IPv4 addresses,
|
|
|
|
.BR IN6ADDR_LOOPBACK_INIT
|
|
|
|
for IPv6 address);
|
|
|
|
this is used by applications that intend to communicate
|
|
|
|
with peers running on the same host.
|
|
|
|
.PP
|
|
|
|
.I service
|
|
|
|
sets the port in each returned address structure.
|
|
|
|
If this argument is a service name (see
|
|
|
|
.BR services (5)),
|
|
|
|
it is translated to the corresponding port number.
|
|
|
|
This argument can also be specified as a decimal number,
|
|
|
|
which is simply converted to binary.
|
|
|
|
If
|
|
|
|
.I service
|
|
|
|
is NULL, then the port number of the returned socket addresses
|
|
|
|
will be left uninitialized.
|
|
|
|
If
|
|
|
|
.B AI_NUMERICSERV
|
|
|
|
is specified in
|
|
|
|
.I hints.ai_flags
|
|
|
|
and
|
|
|
|
.I service
|
|
|
|
is not NULL, then
|
|
|
|
.I service
|
|
|
|
must point to a string containing a numeric port number.
|
|
|
|
This flag is used to inhibit the invocation of a name resolution service
|
|
|
|
in cases where it is known not to be required.
|
|
|
|
.PP
|
|
|
|
Either
|
|
|
|
.I node
|
|
|
|
or
|
|
|
|
.IR service ,
|
|
|
|
but not both, may be NULL.
|
|
|
|
.PP
|
2004-11-03 13:51:07 +00:00
|
|
|
The
|
2007-11-24 10:10:39 +00:00
|
|
|
.BR getaddrinfo ()
|
2008-06-13 10:00:32 +00:00
|
|
|
function allocates and initializes a linked list of
|
2005-11-02 13:55:25 +00:00
|
|
|
.I addrinfo
|
2008-06-13 10:00:32 +00:00
|
|
|
structures, one for each network address that matches
|
|
|
|
.I node
|
|
|
|
and
|
|
|
|
.IR service ,
|
|
|
|
subject to any restrictions imposed by
|
|
|
|
.IR hints ,
|
|
|
|
and returns a pointer to the start of the list in
|
2008-07-18 08:37:37 +00:00
|
|
|
.IR res .
|
2008-06-13 10:00:32 +00:00
|
|
|
The items in the linked list are linked by the
|
|
|
|
.I ai_next
|
|
|
|
field.
|
2008-12-05 17:07:00 +00:00
|
|
|
|
2008-06-13 10:00:32 +00:00
|
|
|
There are several reasons why
|
|
|
|
the linked list may have more than one
|
2007-04-12 22:42:49 +00:00
|
|
|
.I addrinfo
|
getaddrinfo.3, setlocale.3, strchr.3, wctob.3, st.4, glob.7, locale.7, regex.7, standards.7, unicode.7, utf-8.7: Global fix: s/multi-/multi/
The tendency in English, as prescribed in style guides like
Chicago MoS, is towards removing hyphens after prefixes
like "multi-" etc.
Signed-off-by: Michael Kerrisk <mtk.manpages@gmail.com>
2010-01-16 17:47:55 +00:00
|
|
|
structure, including: the network host is multihomed, accessible
|
2008-12-05 17:07:00 +00:00
|
|
|
over multiple protocols (e.g. both
|
|
|
|
.BR AF_INET
|
|
|
|
and
|
|
|
|
.BR AF_INET6 );
|
|
|
|
or the same service is available from multiple socket types (one
|
2008-06-13 10:00:32 +00:00
|
|
|
.B SOCK_STREAM
|
|
|
|
address and another
|
|
|
|
.B SOCK_DGRAM
|
|
|
|
address, for example).
|
2008-12-05 17:07:00 +00:00
|
|
|
Normally, the application should try
|
|
|
|
using the addresses in the order in which they are returned.
|
|
|
|
The sorting function used within
|
|
|
|
.BR getaddrinfo ()
|
|
|
|
is defined in RFC\ 3484; the order can be tweaked for a particular
|
|
|
|
system by editing
|
2008-12-06 03:53:52 +00:00
|
|
|
.IR /etc/gai.conf
|
2008-12-05 17:07:00 +00:00
|
|
|
(available since glibc 2.5).
|
2008-06-13 10:00:32 +00:00
|
|
|
.PP
|
|
|
|
If
|
2005-08-09 11:40:12 +00:00
|
|
|
.I hints.ai_flags
|
2004-11-03 13:51:07 +00:00
|
|
|
includes the
|
|
|
|
.B AI_CANONNAME
|
2008-06-13 10:00:32 +00:00
|
|
|
flag, then the
|
|
|
|
.I ai_canonname
|
|
|
|
field of the first of the
|
|
|
|
.I addrinfo
|
|
|
|
structures in the returned list is set to point to the
|
|
|
|
official name of the host.
|
2007-04-12 22:42:49 +00:00
|
|
|
.\" In glibc prior to 2.3.4, the ai_canonname of each addrinfo
|
2005-08-09 10:10:29 +00:00
|
|
|
.\" structure was set pointing to the canonical name; that was
|
2007-04-12 22:42:49 +00:00
|
|
|
.\" more than POSIX.1-2001 specified, or other implementations provided.
|
2005-08-09 10:10:29 +00:00
|
|
|
.\" MTK, Aug 05
|
2008-06-13 10:00:32 +00:00
|
|
|
|
|
|
|
The remaining fields of each returned
|
|
|
|
.I addrinfo
|
|
|
|
structure are initialized as follows:
|
|
|
|
.IP * 2
|
|
|
|
The
|
2008-06-30 10:48:55 +00:00
|
|
|
.IR ai_family ,
|
2004-11-03 13:51:07 +00:00
|
|
|
.IR ai_socktype ,
|
|
|
|
and
|
|
|
|
.I ai_protocol
|
2008-06-13 10:00:32 +00:00
|
|
|
fields return the socket creation parameters (i.e., these fields have
|
|
|
|
the same meaning as the corresponding arguments of
|
2008-02-26 08:27:51 +00:00
|
|
|
.BR socket (2)).
|
2008-06-13 10:00:32 +00:00
|
|
|
For example,
|
|
|
|
.I ai_family
|
|
|
|
might return
|
|
|
|
.B AF_INET
|
|
|
|
or
|
|
|
|
.BR AF_INET6 ;
|
|
|
|
.I ai_socktype
|
|
|
|
might return
|
|
|
|
.B SOCK_DGRAM
|
|
|
|
or
|
|
|
|
.BR SOCK_STREAM ;
|
|
|
|
and
|
|
|
|
.I ai_protocol
|
|
|
|
returns the protocol for the socket.
|
|
|
|
.IP *
|
2004-11-03 13:51:07 +00:00
|
|
|
A pointer to the socket address is placed in the
|
|
|
|
.I ai_addr
|
2008-06-13 10:00:32 +00:00
|
|
|
field, and the length of the socket address, in bytes,
|
2004-11-03 13:51:07 +00:00
|
|
|
is placed in the
|
|
|
|
.I ai_addrlen
|
2008-06-13 10:00:32 +00:00
|
|
|
field.
|
2004-11-03 13:51:07 +00:00
|
|
|
.PP
|
2005-08-09 11:40:12 +00:00
|
|
|
If
|
|
|
|
.I hints.ai_flags
|
|
|
|
includes the
|
|
|
|
.B AI_ADDRCONFIG
|
|
|
|
flag, then IPv4 addresses are returned in the list pointed to by
|
2009-09-15 03:49:09 +00:00
|
|
|
.I res
|
2007-04-12 22:42:49 +00:00
|
|
|
only if the local system has at least one
|
|
|
|
IPv4 address configured, and IPv6 addresses are only returned
|
2005-08-09 11:40:12 +00:00
|
|
|
if the local system has at least one IPv6 address configured.
|
|
|
|
.PP
|
|
|
|
If
|
|
|
|
.I hint.ai_flags
|
|
|
|
specifies the
|
|
|
|
.B AI_V4MAPPED
|
|
|
|
flag, and
|
|
|
|
.I hints.ai_family
|
|
|
|
was specified as
|
|
|
|
.BR AF_INET6 ,
|
|
|
|
and no matching IPv6 addresses could be found,
|
|
|
|
then return IPv4-mapped IPv6 addresses in the list pointed to by
|
2009-09-15 03:49:09 +00:00
|
|
|
.IR res .
|
2005-08-09 11:40:12 +00:00
|
|
|
If both
|
|
|
|
.B AI_V4MAPPED
|
|
|
|
and
|
|
|
|
.B AI_ALL
|
|
|
|
are specified in
|
2010-06-16 20:54:52 +00:00
|
|
|
.IR hints.ai_flags ,
|
2007-04-12 22:42:49 +00:00
|
|
|
then return both IPv6 and IPv4-mapped IPv6 addresses
|
2005-08-09 11:40:12 +00:00
|
|
|
in the list pointed to by
|
2009-09-15 03:49:09 +00:00
|
|
|
.IR res .
|
2005-08-09 11:40:12 +00:00
|
|
|
.B AI_ALL
|
|
|
|
is ignored if
|
|
|
|
.B AI_V4MAPPED
|
|
|
|
is not also specified.
|
|
|
|
.PP
|
2004-11-03 13:51:07 +00:00
|
|
|
The
|
2007-11-24 10:10:39 +00:00
|
|
|
.BR freeaddrinfo ()
|
2004-11-03 13:51:07 +00:00
|
|
|
function frees the memory that was allocated
|
2005-08-09 10:10:29 +00:00
|
|
|
for the dynamically allocated linked list
|
2004-11-03 13:51:07 +00:00
|
|
|
.IR res .
|
2006-11-25 05:35:02 +00:00
|
|
|
.SS "Extensions to getaddrinfo() for Internationalized Domain Names"
|
|
|
|
.PP
|
|
|
|
Starting with glibc 2.3.4,
|
2007-04-12 22:42:49 +00:00
|
|
|
.BR getaddrinfo ()
|
|
|
|
has been extended to selectively allow the incoming and outgoing
|
2008-06-27 03:37:56 +00:00
|
|
|
hostnames to be transparently converted to and from the
|
2006-11-25 05:35:02 +00:00
|
|
|
Internationalized Domain Name (IDN) format (see RFC 3490,
|
|
|
|
.IR "Internationalizing Domain Names in Applications (IDNA)" ).
|
|
|
|
Four new flags are defined:
|
|
|
|
.TP
|
|
|
|
.B AI_IDN
|
|
|
|
If this flag is specified, then the node name given in
|
|
|
|
.I node
|
|
|
|
is converted to IDN format if necessary.
|
|
|
|
The source encoding is that of the current locale.
|
|
|
|
|
2007-04-12 22:42:49 +00:00
|
|
|
If the input name contains non-ASCII characters, then the IDN encoding
|
|
|
|
is used.
|
2006-11-25 05:35:02 +00:00
|
|
|
Those parts of the node name (delimited by dots) that contain
|
2007-04-12 22:42:49 +00:00
|
|
|
non-ASCII characters are encoded using ASCII Compatible Encoding (ACE)
|
2006-11-25 05:35:02 +00:00
|
|
|
before being passed to the name resolution functions.
|
|
|
|
.\" 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.
|
|
|
|
.TP
|
|
|
|
.B AI_CANONIDN
|
2007-04-12 22:42:49 +00:00
|
|
|
After a successful name lookup, and if the
|
|
|
|
.B AI_CANONNAME
|
2006-11-25 05:35:02 +00:00
|
|
|
flag was specified,
|
|
|
|
.BR getaddrinfo ()
|
|
|
|
will return the canonical name of the
|
2007-04-12 22:42:49 +00:00
|
|
|
node corresponding to the
|
|
|
|
.I addrinfo
|
2006-11-25 05:35:02 +00:00
|
|
|
structure value passed back.
|
|
|
|
The return value is an exact copy of the value returned by the name
|
|
|
|
resolution function.
|
|
|
|
|
2007-04-12 22:42:49 +00:00
|
|
|
If the name is encoded using ACE, then it will contain the
|
2007-12-22 16:40:46 +00:00
|
|
|
.I xn\-\-
|
2007-04-12 22:42:49 +00:00
|
|
|
prefix for one or more components of the name.
|
|
|
|
To convert these components into a readable form the
|
|
|
|
.B AI_CANONIDN
|
|
|
|
flag can be passed in addition to
|
|
|
|
.BR AI_CANONNAME .
|
2006-11-25 05:35:02 +00:00
|
|
|
The resulting string is encoded using the current locale's encoding.
|
|
|
|
.\"
|
|
|
|
.\"Implementation Detail:
|
2007-12-22 16:40:46 +00:00
|
|
|
.\"If no component of the returned name starts with xn\-\- the IDN
|
2006-11-25 05:35:02 +00:00
|
|
|
.\"step can be skipped, therefore avoiding unnecessary slowdowns.
|
|
|
|
.TP
|
|
|
|
.BR AI_IDN_ALLOW_UNASSIGNED ", " AI_IDN_USE_STD3_ASCII_RULES
|
2007-04-12 22:42:49 +00:00
|
|
|
Setting these flags will enable the
|
2006-11-25 05:35:02 +00:00
|
|
|
IDNA_ALLOW_UNASSIGNED (allow unassigned Unicode code points) and
|
2007-04-12 22:42:49 +00:00
|
|
|
IDNA_USE_STD3_ASCII_RULES (check output to make sure it is a STD3
|
2008-06-27 03:37:56 +00:00
|
|
|
conforming hostname)
|
2006-11-25 05:35:02 +00:00
|
|
|
flags respectively to be used in the IDNA handling.
|
2004-11-03 13:51:07 +00:00
|
|
|
.SH "RETURN VALUE"
|
2006-11-25 05:36:26 +00:00
|
|
|
.\" FIXME glibc defines the following additional errors, some which
|
2007-04-12 22:42:49 +00:00
|
|
|
.\" can probably be returned by getaddrinfo(); they need to
|
2006-11-25 05:35:02 +00:00
|
|
|
.\" be documented.
|
2007-12-09 07:50:38 +00:00
|
|
|
.\" #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
|
2007-11-24 10:10:39 +00:00
|
|
|
.BR getaddrinfo ()
|
intro.1, time.1, adjtimex.2, capget.2, eventfd.2, fcntl.2, getrlimit.2, getsockopt.2, gettimeofday.2, intro.2, ioctl_list.2, ioperm.2, mlock.2, pivot_root.2, poll.2, prctl.2, ptrace.2, sched_setscheduler.2, select_tut.2, semget.2, sigaltstack.2, signalfd.2, sysctl.2, timer_settime.2, timerfd_create.2, wait.2, CPU_SET.3, argz_add.3, assert_perror.3, atexit.3, backtrace.3, bcmp.3, clearenv.3, ctime.3, dl_iterate_phdr.3, dlopen.3, ecvt.3, errno.3, error.3, ether_aton.3, exit.3, fenv.3, ferror.3, finite.3, flockfile.3, fnmatch.3, fpathconf.3, fpclassify.3, ftime.3, ftok.3, ftw.3, fwide.3, getaddrinfo.3, gethostbyname.3, getlogin.3, getnameinfo.3, getnetent.3, getopt.3, getprotoent.3, getrpcent.3, getservent.3, glob.3, hsearch.3, inet.3, isalpha.3, iswalnum.3, iswalpha.3, iswblank.3, iswcntrl.3, iswctype.3, iswdigit.3, iswgraph.3, iswlower.3, iswprint.3, iswpunct.3, iswspace.3, iswupper.3, iswxdigit.3, longjmp.3, lsearch.3, malloc.3, matherr.3, mblen.3, mbsinit.3, mbtowc.3, on_exit.3, printf.3, pthread_attr_init.3, pthread_attr_setaffinity_np.3, pthread_attr_setdetachstate.3, pthread_attr_setguardsize.3, pthread_attr_setinheritsched.3, pthread_attr_setschedparam.3, pthread_attr_setschedpolicy.3, pthread_attr_setscope.3, pthread_attr_setstack.3, pthread_attr_setstackaddr.3, pthread_attr_setstacksize.3, pthread_cancel.3, pthread_cleanup_push.3, pthread_equal.3, pthread_getattr_np.3, pthread_getcpuclockid.3, pthread_setaffinity_np.3, pthread_setcancelstate.3, pthread_setconcurrency.3, pthread_setschedparam.3, pthread_setschedprio.3, ptsname.3, putenv.3, putgrent.3, raise.3, rcmd.3, regex.3, rexec.3, rpc.3, rpmatch.3, rtnetlink.3, scandir.3, sem_init.3, setaliasent.3, setbuf.3, setenv.3, setjmp.3, signbit.3, stdio_ext.3, strtod.3, strtol.3, strtoul.3, system.3, termios.3, timeradd.3, tzset.3, ualarm.3, wctomb.3, xdr.3, st.4, tty_ioctl.4, core.5, elf.5, proc.5, bootparam.7, capabilities.7, icmp.7, ip.7, ipv6.7, math_error.7, mdoc.samples.7, mq_overview.7, pthreads.7, raw.7, regex.7, socket.7, tcp.7, tzselect.8: Global fix: s/non-zero/nonzero/
The tendency in English, as prescribed in style guides like
Chicago MoS, is towards removing hyphens after prefixes
like "non-" etc.
Signed-off-by: Michael Kerrisk <mtk.manpages@gmail.com>
2010-01-16 16:40:55 +00:00
|
|
|
returns 0 if it succeeds, or one of the following nonzero error codes:
|
2004-11-03 13:51:07 +00:00
|
|
|
.TP
|
2005-12-06 15:18:03 +00:00
|
|
|
.B EAI_ADDRFAMILY
|
2008-06-13 10:00:32 +00:00
|
|
|
.\" Not in SUSv3
|
2005-12-06 15:18:03 +00:00
|
|
|
The specified network host does not have any network addresses in the
|
|
|
|
requested address family.
|
2004-11-03 13:51:07 +00:00
|
|
|
.TP
|
2005-12-06 15:18:03 +00:00
|
|
|
.B EAI_AGAIN
|
|
|
|
The name server returned a temporary failure indication.
|
|
|
|
Try again later.
|
2004-11-03 13:51:07 +00:00
|
|
|
.TP
|
|
|
|
.B EAI_BADFLAGS
|
2008-10-29 03:31:02 +00:00
|
|
|
.I hints.ai_flags
|
|
|
|
contains invalid flags; or,
|
|
|
|
.I hints.ai_flags
|
|
|
|
included
|
|
|
|
.B AI_CANONNAME
|
|
|
|
and
|
|
|
|
.I name
|
|
|
|
was NULL.
|
2004-11-03 13:51:07 +00:00
|
|
|
.TP
|
2005-12-06 15:18:03 +00:00
|
|
|
.B EAI_FAIL
|
|
|
|
The name server returned a permanent failure indication.
|
|
|
|
.TP
|
|
|
|
.B EAI_FAMILY
|
2008-06-13 10:00:32 +00:00
|
|
|
The requested address family is not supported.
|
2005-12-06 15:18:03 +00:00
|
|
|
.TP
|
|
|
|
.B EAI_MEMORY
|
|
|
|
Out of memory.
|
|
|
|
.TP
|
|
|
|
.B EAI_NODATA
|
2008-06-13 10:00:32 +00:00
|
|
|
.\" Not in SUSv3
|
2005-12-06 15:18:03 +00:00
|
|
|
The specified network host exists, but does not have any
|
|
|
|
network addresses defined.
|
|
|
|
.TP
|
2004-11-03 13:51:07 +00:00
|
|
|
.B EAI_NONAME
|
|
|
|
The
|
|
|
|
.I node
|
|
|
|
or
|
|
|
|
.I service
|
2005-08-09 11:40:12 +00:00
|
|
|
is not known; or both
|
2004-11-03 13:51:07 +00:00
|
|
|
.I node
|
|
|
|
and
|
|
|
|
.I service
|
2005-08-09 11:40:12 +00:00
|
|
|
are NULL; or
|
|
|
|
.B AI_NUMERICSERV
|
|
|
|
was specified in
|
|
|
|
.I hints.ai_flags
|
2007-04-12 22:42:49 +00:00
|
|
|
and
|
2005-08-09 11:40:12 +00:00
|
|
|
.I service
|
|
|
|
was not a numeric port-number string.
|
2004-11-03 13:51:07 +00:00
|
|
|
.TP
|
|
|
|
.B EAI_SERVICE
|
|
|
|
The requested service is not available for the requested socket type.
|
|
|
|
It may be available through another socket type.
|
2008-10-29 03:31:02 +00:00
|
|
|
For example, this error could occur if
|
|
|
|
.I service
|
|
|
|
was "shell" (a service only available on stream sockets), and either
|
|
|
|
.I hints.ai_protocol
|
|
|
|
was
|
|
|
|
.BR IPPROTO_UDP ,
|
|
|
|
or
|
|
|
|
.I hints.ai_socktype
|
|
|
|
was
|
|
|
|
.BR SOCK_DGRAM ;
|
|
|
|
or the error could occur if
|
|
|
|
.I service
|
|
|
|
was not NULL, and
|
|
|
|
.I hints.ai_socktype
|
|
|
|
was
|
|
|
|
.BR SOCK_RAW
|
|
|
|
(a socket type that does not support the concept of services).
|
2004-11-03 13:51:07 +00:00
|
|
|
.TP
|
2005-12-06 15:18:03 +00:00
|
|
|
.B EAI_SOCKTYPE
|
2008-06-13 10:00:32 +00:00
|
|
|
The requested socket type is not supported.
|
2008-10-29 03:31:02 +00:00
|
|
|
This could occur, for example, if
|
|
|
|
.I hints.ai_socktype
|
|
|
|
and
|
|
|
|
.I hints.ai_protocol
|
2008-10-29 20:43:44 +00:00
|
|
|
are inconsistent (e.g.,
|
2008-10-29 03:31:02 +00:00
|
|
|
.BR SOCK_DGRAM
|
|
|
|
and
|
|
|
|
.BR IPPROTO_TCP ,
|
2009-09-06 05:09:18 +00:00
|
|
|
respectively).
|
2004-11-03 13:51:07 +00:00
|
|
|
.TP
|
|
|
|
.B EAI_SYSTEM
|
|
|
|
Other system error, check
|
|
|
|
.I errno
|
|
|
|
for details.
|
|
|
|
.PP
|
|
|
|
The
|
2007-11-24 10:10:39 +00:00
|
|
|
.BR gai_strerror ()
|
2004-11-03 13:51:07 +00:00
|
|
|
function translates these error codes to a human readable string,
|
|
|
|
suitable for error reporting.
|
2008-12-05 17:07:00 +00:00
|
|
|
.SH "FILES"
|
|
|
|
.I /etc/gai.conf
|
2004-11-03 13:51:07 +00:00
|
|
|
.SH "CONFORMING TO"
|
2006-08-03 13:57:30 +00:00
|
|
|
POSIX.1-2001.
|
2004-11-03 13:51:07 +00:00
|
|
|
The
|
2005-10-19 07:07:02 +00:00
|
|
|
.BR getaddrinfo ()
|
2005-07-20 07:50:45 +00:00
|
|
|
function is documented in RFC\ 2553.
|
2005-08-09 11:40:12 +00:00
|
|
|
.SH "NOTES"
|
2008-06-26 14:33:37 +00:00
|
|
|
.BR getaddrinfo ()
|
|
|
|
supports the
|
|
|
|
.IB address % scope-id
|
|
|
|
notation for specifying the IPv6 scope-ID.
|
|
|
|
|
2005-08-09 11:40:12 +00:00
|
|
|
.BR AI_ADDRCONFIG ,
|
2006-07-05 12:32:46 +00:00
|
|
|
.BR AI_ALL ,
|
2005-08-09 11:40:12 +00:00
|
|
|
and
|
2007-09-20 16:26:31 +00:00
|
|
|
.B AI_V4MAPPED
|
2005-08-09 11:40:12 +00:00
|
|
|
are available since glibc 2.3.3.
|
2007-09-20 16:26:31 +00:00
|
|
|
.B AI_NUMERICSERV
|
2005-08-09 11:40:12 +00:00
|
|
|
is available since glibc 2.3.4.
|
2009-09-06 05:07:01 +00:00
|
|
|
|
|
|
|
According to POSIX.1-2001, specifying
|
|
|
|
.I hints
|
|
|
|
as NULL should cause
|
|
|
|
.I ai_flags
|
|
|
|
to be assumed as 0.
|
|
|
|
The GNU C library instead assumes a value of
|
2009-09-30 01:34:51 +00:00
|
|
|
.BR "(AI_V4MAPPED\ |\ AI_ADDRCONFIG)"
|
2009-09-06 05:07:01 +00:00
|
|
|
for this case,
|
|
|
|
since this value is considered an improvement on the specification.
|
2007-05-28 10:30:10 +00:00
|
|
|
.SH EXAMPLE
|
2007-05-28 10:55:41 +00:00
|
|
|
.\" 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
|
2007-05-28 10:30:10 +00:00
|
|
|
The following programs demonstrate the use of
|
|
|
|
.BR getaddrinfo (),
|
|
|
|
.BR gai_strerror (),
|
|
|
|
.BR freeaddrinfo (),
|
|
|
|
and
|
|
|
|
.BR getnameinfo (3).
|
|
|
|
The programs are an echo server and client for UDP datagrams.
|
2008-10-28 16:18:09 +00:00
|
|
|
.SS Server program
|
eventfd.2, getdents.2, mprotect.2, signalfd.2, timerfd_create.2, wait.2, backtrace.3, clock_getcpuclockid.3, end.3, fmemopen.3, fopencookie.3, frexp.3, getaddrinfo.3, getdate.3, getgrouplist.3, getprotoent_r.3, getservent_r.3, gnu_get_libc_version.3, inet.3, inet_pton.3, makecontext.3, matherr.3, offsetof.3, pthread_attr_init.3, pthread_create.3, pthread_getattr_np.3, sem_wait.3, strftime.3, strtok.3, strtol.3, core.5: srcfix
s/\.R " "/\\\&/ as a way of getting a blank line after a .SS heading.
(Suggested by Sam Varshavchik <mrsam@courier-mta.com>)
Signed-off-by: Michael Kerrisk <mtk.manpages@gmail.com>
2008-11-05 01:42:45 +00:00
|
|
|
\&
|
2007-05-28 10:30:10 +00:00
|
|
|
.nf
|
2007-06-21 22:55:04 +00:00
|
|
|
#include <sys/types.h>
|
2007-05-28 10:30:10 +00:00
|
|
|
#include <stdio.h>
|
2007-06-21 22:55:04 +00:00
|
|
|
#include <stdlib.h>
|
|
|
|
#include <unistd.h>
|
|
|
|
#include <string.h>
|
|
|
|
#include <sys/socket.h>
|
2007-05-28 10:30:10 +00:00
|
|
|
#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\\n", 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 */
|
2007-07-26 17:11:55 +00:00
|
|
|
hints.ai_canonname = NULL;
|
|
|
|
hints.ai_addr = NULL;
|
|
|
|
hints.ai_next = NULL;
|
2007-05-28 10:30:10 +00:00
|
|
|
|
|
|
|
s = getaddrinfo(NULL, argv[1], &hints, &result);
|
|
|
|
if (s != 0) {
|
|
|
|
fprintf(stderr, "getaddrinfo: %s\\n", gai_strerror(s));
|
|
|
|
exit(EXIT_FAILURE);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* getaddrinfo() returns a list of address structures.
|
2007-07-08 14:59:09 +00:00
|
|
|
Try each address until we successfully bind(2).
|
2007-06-21 22:55:04 +00:00
|
|
|
If socket(2) (or bind(2)) fails, we (close the socket
|
2007-05-28 10:30:10 +00:00
|
|
|
and) try the next address. */
|
|
|
|
|
2007-06-20 21:39:45 +00:00
|
|
|
for (rp = result; rp != NULL; rp = rp\->ai_next) {
|
2007-06-21 22:55:04 +00:00
|
|
|
sfd = socket(rp\->ai_family, rp\->ai_socktype,
|
2007-06-20 21:39:45 +00:00
|
|
|
rp\->ai_protocol);
|
|
|
|
if (sfd == \-1)
|
2007-05-28 10:30:10 +00:00
|
|
|
continue;
|
|
|
|
|
2007-06-20 21:39:45 +00:00
|
|
|
if (bind(sfd, rp\->ai_addr, rp\->ai_addrlen) == 0)
|
2007-05-28 10:30:10 +00:00
|
|
|
break; /* Success */
|
|
|
|
|
|
|
|
close(sfd);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (rp == NULL) { /* No address succeeded */
|
|
|
|
fprintf(stderr, "Could not bind\\n");
|
|
|
|
exit(EXIT_FAILURE);
|
|
|
|
}
|
|
|
|
|
|
|
|
freeaddrinfo(result); /* No longer needed */
|
|
|
|
|
|
|
|
/* Read datagrams and echo them back to sender */
|
|
|
|
|
|
|
|
for (;;) {
|
|
|
|
peer_addr_len = sizeof(struct sockaddr_storage);
|
2007-06-21 22:55:04 +00:00
|
|
|
nread = recvfrom(sfd, buf, BUF_SIZE, 0,
|
2007-05-28 10:30:10 +00:00
|
|
|
(struct sockaddr *) &peer_addr, &peer_addr_len);
|
2007-06-20 21:39:45 +00:00
|
|
|
if (nread == \-1)
|
2007-05-28 10:30:10 +00:00
|
|
|
continue; /* Ignore failed request */
|
|
|
|
|
|
|
|
char host[NI_MAXHOST], service[NI_MAXSERV];
|
2007-06-21 22:55:04 +00:00
|
|
|
|
|
|
|
s = getnameinfo((struct sockaddr *) &peer_addr,
|
2007-05-28 10:30:10 +00:00
|
|
|
peer_addr_len, host, NI_MAXHOST,
|
|
|
|
service, NI_MAXSERV, NI_NUMERICSERV);
|
2007-06-21 22:55:04 +00:00
|
|
|
if (s == 0)
|
2007-05-28 10:30:10 +00:00
|
|
|
printf("Received %ld bytes from %s:%s\\n",
|
|
|
|
(long) nread, host, service);
|
|
|
|
else
|
|
|
|
fprintf(stderr, "getnameinfo: %s\\n", gai_strerror(s));
|
|
|
|
|
2007-06-21 22:55:04 +00:00
|
|
|
if (sendto(sfd, buf, nread, 0,
|
2007-05-28 10:30:10 +00:00
|
|
|
(struct sockaddr *) &peer_addr,
|
2007-06-21 22:55:04 +00:00
|
|
|
peer_addr_len) != nread)
|
2007-05-28 10:30:10 +00:00
|
|
|
fprintf(stderr, "Error sending response\\n");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
.fi
|
2008-10-28 16:18:09 +00:00
|
|
|
.SS Client program
|
2009-12-03 14:36:19 +00:00
|
|
|
\&
|
2007-05-28 10:30:10 +00:00
|
|
|
.nf
|
2007-06-21 22:55:04 +00:00
|
|
|
#include <sys/types.h>
|
2007-05-28 10:30:10 +00:00
|
|
|
#include <sys/socket.h>
|
|
|
|
#include <netdb.h>
|
|
|
|
#include <stdio.h>
|
2007-06-21 22:55:04 +00:00
|
|
|
#include <stdlib.h>
|
|
|
|
#include <unistd.h>
|
|
|
|
#include <string.h>
|
2007-05-28 10:30:10 +00:00
|
|
|
|
|
|
|
#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...\\n", 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\\n", gai_strerror(s));
|
|
|
|
exit(EXIT_FAILURE);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* getaddrinfo() returns a list of address structures.
|
2007-07-08 14:59:09 +00:00
|
|
|
Try each address until we successfully connect(2).
|
|
|
|
If socket(2) (or connect(2)) fails, we (close the socket
|
2007-05-28 10:30:10 +00:00
|
|
|
and) try the next address. */
|
|
|
|
|
2007-06-20 21:39:45 +00:00
|
|
|
for (rp = result; rp != NULL; rp = rp\->ai_next) {
|
2007-06-21 22:55:04 +00:00
|
|
|
sfd = socket(rp\->ai_family, rp\->ai_socktype,
|
2007-06-20 21:39:45 +00:00
|
|
|
rp\->ai_protocol);
|
|
|
|
if (sfd == \-1)
|
2007-05-28 10:30:10 +00:00
|
|
|
continue;
|
2007-06-21 22:55:04 +00:00
|
|
|
|
2007-06-20 21:39:45 +00:00
|
|
|
if (connect(sfd, rp\->ai_addr, rp\->ai_addrlen) != \-1)
|
2007-05-28 10:30:10 +00:00
|
|
|
break; /* Success */
|
|
|
|
|
|
|
|
close(sfd);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (rp == NULL) { /* No address succeeded */
|
|
|
|
fprintf(stderr, "Could not connect\\n");
|
|
|
|
exit(EXIT_FAILURE);
|
|
|
|
}
|
|
|
|
|
|
|
|
freeaddrinfo(result); /* No longer needed */
|
|
|
|
|
2007-06-21 22:55:04 +00:00
|
|
|
/* Send remaining command\-line arguments as separate
|
2007-05-28 10:30:10 +00:00
|
|
|
datagrams, and read responses from server */
|
|
|
|
|
|
|
|
for (j = 3; j < argc; j++) {
|
2007-06-21 22:55:04 +00:00
|
|
|
len = strlen(argv[j]) + 1;
|
2007-05-28 10:30:10 +00:00
|
|
|
/* +1 for terminating null byte */
|
|
|
|
|
|
|
|
if (len + 1 > BUF_SIZE) {
|
2007-06-21 22:55:04 +00:00
|
|
|
fprintf(stderr,
|
2007-05-28 10:30:10 +00:00
|
|
|
"Ignoring long message in argument %d\\n", j);
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (write(sfd, argv[j], len) != len) {
|
|
|
|
fprintf(stderr, "partial/failed write\\n");
|
|
|
|
exit(EXIT_FAILURE);
|
|
|
|
}
|
2007-06-21 22:55:04 +00:00
|
|
|
|
2007-05-28 10:30:10 +00:00
|
|
|
nread = read(sfd, buf, BUF_SIZE);
|
2007-06-20 21:39:45 +00:00
|
|
|
if (nread == \-1) {
|
2007-05-28 10:30:10 +00:00
|
|
|
perror("read");
|
|
|
|
exit(EXIT_FAILURE);
|
|
|
|
}
|
|
|
|
|
|
|
|
printf("Received %ld bytes: %s\\n", (long) nread, buf);
|
|
|
|
}
|
|
|
|
|
|
|
|
exit(EXIT_SUCCESS);
|
|
|
|
}
|
|
|
|
.fi
|
2004-11-03 13:51:07 +00:00
|
|
|
.SH "SEE ALSO"
|
2007-10-14 18:20:32 +00:00
|
|
|
.\" .BR getipnodebyaddr (3),
|
2007-12-17 11:27:53 +00:00
|
|
|
.\" .BR getipnodebyname (3),
|
2008-06-13 10:00:32 +00:00
|
|
|
.BR gethostbyname (3),
|
2008-06-11 21:31:42 +00:00
|
|
|
.BR getnameinfo (3),
|
2008-06-13 10:00:32 +00:00
|
|
|
.BR inet (3),
|
|
|
|
.BR hostname (7),
|
|
|
|
.BR ip (7)
|