Line 7: | Line 7: | ||
service names to a linked list of <code>struct addrinfo</code> | service names to a linked list of <code>struct addrinfo</code> | ||
objects. | objects. | ||
==== Running <code>getaddrinfo()</code> ==== | |||
And example of <code>getaddrinfo()</code> call: | And example of <code>getaddrinfo()</code> call: | ||
Line 41: | Line 43: | ||
On success, the ''error'' variable is assigned to 0 and ''result'' is pointed to | On success, the ''error'' variable is assigned to 0 and ''result'' is pointed to | ||
a linked list of ''one or | a linked list of one or more <code>struct addrinfo</code> objects. | ||
'''Never assume that getaddrinfo() returns only one result or that the first result actually works!''' | |||
==== Using <code>getaddrinfo()</code> results ==== | |||
==== Freeing <code>getaddrinfo()</code> results ==== | |||
When we're done with the results, we'll free the linked list. | |||
<pre> | |||
freeaddrinfo(result); | |||
</pre> |
Revision as of 21:22, 21 November 2012
Domain Name System
Resolving using getaddrinfo()
in applications
The getaddrinfo()
function is a dualstack-friendly API to name
resolution. It is used by applications to translate host and
service names to a linked list of struct addrinfo
objects.
Running getaddrinfo()
And example of getaddrinfo()
call:
const char *node = "www.fedoraproject.org"; const char *service = "http"; struct addrinfo hints = { .ai_family = AF_UNSPEC, .ai_socktype = SOCK_DGRAM, .ai_flags = 0, .ai_protocol = 0, .ai_canonname = NULL, .ai_addr = NULL, .ai_next = NULL }; struct addrinfo *result; int error; error = getaddrinfo(node, service, &hints, &result);
The input of getaddrinfo() consists of node specification, service specification and further hints.
- node: literal IPv4 or IPv6 address, or a hostname to be resolved
- service: numeric port number or a symbolic service name
- hints.ai_family: enable dualprotocol, IPv4-only or IPv6-only queries
- hints.ai_socktype: select socket type (and thus protocol family)
getaddrinfo()
can be futher tweaked with the hints.ai_flags. Other
attributes are either not needed (ai_protocol) or not supposed
to be set in hints (ai_canonname, ai_addr and ai_next).
On success, the error variable is assigned to 0 and result is pointed to
a linked list of one or more struct addrinfo
objects.
Never assume that getaddrinfo() returns only one result or that the first result actually works!
Using getaddrinfo()
results
Freeing getaddrinfo()
results
When we're done with the results, we'll free the linked list.
freeaddrinfo(result);