summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Doc/library/socket.rst35
1 files changed, 32 insertions, 3 deletions
diff --git a/Doc/library/socket.rst b/Doc/library/socket.rst
index 0c7b932..6358d14 100644
--- a/Doc/library/socket.rst
+++ b/Doc/library/socket.rst
@@ -928,7 +928,9 @@ The :mod:`socket` module also offers various network-related services:
.. versionadded:: 3.7
-.. function:: getaddrinfo(host, port, family=0, type=0, proto=0, flags=0)
+.. function:: getaddrinfo(host, port, family=AF_UNSPEC, type=0, proto=0, flags=0)
+
+ This function wraps the C function ``getaddrinfo`` of the underlying system.
Translate the *host*/*port* argument into a sequence of 5-tuples that contain
all the necessary arguments for creating a socket connected to that service.
@@ -938,8 +940,10 @@ The :mod:`socket` module also offers various network-related services:
and *port*, you can pass ``NULL`` to the underlying C API.
The *family*, *type* and *proto* arguments can be optionally specified
- in order to narrow the list of addresses returned. Passing zero as a
- value for each of these arguments selects the full range of results.
+ in order to provide options and limit the list of addresses returned.
+ Pass their default values (:data:`AF_UNSPEC`, 0, and 0, respectively)
+ to not limit the results. See the note below for details.
+
The *flags* argument can be one or several of the ``AI_*`` constants,
and will influence how results are computed and returned.
For example, :const:`AI_NUMERICHOST` will disable domain name resolution
@@ -959,6 +963,29 @@ The :mod:`socket` module also offers various network-related services:
:const:`AF_INET6`), and is meant to be passed to the :meth:`socket.connect`
method.
+ .. note::
+
+ If you intend to use results from :func:`!getaddrinfo` to create a socket
+ (rather than, for example, retrieve *canonname*),
+ consider limiting the results by *type* (e.g. :data:`SOCK_STREAM` or
+ :data:`SOCK_DGRAM`) and/or *proto* (e.g. :data:`IPPROTO_TCP` or
+ :data:`IPPROTO_UDP`) that your application can handle.
+
+ The behavior with default values of *family*, *type*, *proto*
+ and *flags* is system-specific.
+
+ Many systems (for example, most Linux configurations) will return a sorted
+ list of all matching addresses.
+ These addresses should generally be tried in order until a connection succeeds
+ (possibly tried in parallel, for example, using a `Happy Eyeballs`_ algorithm).
+ In these cases, limiting the *type* and/or *proto* can help eliminate
+ unsuccessful or unusable connecton attempts.
+
+ Some systems will, however, only return a single address.
+ (For example, this was reported on Solaris and AIX configurations.)
+ On these systems, limiting the *type* and/or *proto* helps ensure that
+ this address is usable.
+
.. audit-event:: socket.getaddrinfo host,port,family,type,protocol socket.getaddrinfo
The following example fetches address information for a hypothetical TCP
@@ -978,6 +1005,8 @@ The :mod:`socket` module also offers various network-related services:
for IPv6 multicast addresses, string representing an address will not
contain ``%scope_id`` part.
+.. _Happy Eyeballs: https://en.wikipedia.org/wiki/Happy_Eyeballs
+
.. function:: getfqdn([name])
Return a fully qualified domain name for *name*. If *name* is omitted or empty,