11.10 getaddrinfo Function:
Examples
We will now show some examples of
getaddrinfo using a test program that lets us enter all
the parameters: the hostname, service name, address family, socket
type, and AI_CANONNAME and AI_PASSIVE flags. (We
do not show this test program, as it is about 350 lines of
uninteresting code. It is provided with the source code for the
book, as described in the Preface.) The test program outputs
information on the variable number of addrinfo structures
that are returned, showing the arguments for a call to
socket and the address in each socket address
structure.
We first show the same example as in Figure
11.5.
freebsd % testga -f inet -c -h freebsd4 -s domain
socket (AF_INET, SOCK_DGRAM, 17), ai_canonname = freebsd4.unpbook.com
address: 135.197.17.100:53
socket (AF_INET, SOCK_DGRAM, 17)
address: 172.24.37.94:53
socket (AF_INET, SOCK_STREAM, 6), ai_canonname = freebsd4.unpbook.com
address: 135.197.17.100:53
socket (AF_INET, SOCK_STREAM, 6)
address: 172.24.37.94:53
The -f inet option specifies the
address family, -c says to return the canonical name,
-h bsdi specifies the hostname, and -s domain
specifies the service name.
The common client scenario is to specify the
address family, socket type (the -t option), hostname, and
service name. The following example shows this for a multihomed
host with three IPv4 addresses:
freebsd % testga -f inet -t stream -h gateway.tuc.noao.edu -s daytime
socket (AF_INET, SOCK_STREAM, 6)
address: 140.252.108.1:13
socket (AF_INET, SOCK_STREAM, 6)
address: 140.252.1.4:13
socket (AF_INET, SOCK_STREAM, 6)
address: 140.252.104.1:13
Next, we specify our host aix, which
has both a AAAA record and an A record. We do not specify the
address family, but we provide a service name of ftp,
which is provided by TCP only.
freebsd % testga -h aix -s ftp -t stream
socket (AF_INET6, SOCK_STREAM, 6)
address: [3ffe:b80:1f8d:2:204:acff:fe17:bf38]:21
socket (AF_INET, SOCK_STREAM, 6)
address: 192.168.42.2:21
Since we didn't specify the address family, and
since we ran this example on a host that supports both IPv4 and
IPv6, two structures are returned: one for IPv4 and one for
IPv6.
Next, we specify the AI_PASSIVE flag
(the -p option); we do not specify an address family or
hostname (implying the wildcard address). We also specify a port
number of 8888 and a stream socket.
freebsd % testga -p -s 8888 -t stream
socket (AF_INET6, SOCK_STREAM, 6)
address: [: :]: 8888
socket (AF_INET, SOCK_STREAM, 6)
address: 0.0.0.0:8888
Two structures are returned. Since we ran this
on a host that supports IPv6 and IPv4 without specifying an address
family, getaddrinfo returns the IPv6 wildcard address and
the IPv4 wildcard address. The IPv6 structure is returned before
the IPv4 structure, because we will see in Chapter 12 that an IPv6 client or
server on a dual-stack host can communicate with either IPv6 or
IPv4 peers.
|