From Fedora Project Wiki
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 more'' result objects.
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 ====


'''Warning: Never assume that getaddrinfo() returns just one result! Never assume
==== Freeing <code>getaddrinfo()</code> results ====
that the first result of getaddrinfo() actually works!'''
 
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);