Other Considerations for Developers
Here we will look at a few tips regarding informal standards that have emerged among those producing IPv6-enabled code.
Switching Between IPv4 and IPv6
In many cases, it may be desirable to give the end user the choice of IPv4 or IPv6 operation. The way
this has been implemented in most command-line utilities is to use
either type of address by default, and to add flags -4 and -6 to restrict the program to using IPv4
and IPv6 addresses respectively. This is easy to implement by
setting the appropriate family in the hints passed to getaddrinfo
.
The following code shows how you can set a variable family
based on command-line arguments and
then use that when constructing the hints argument for getaddrinfo
.
if (argc > 1 && strcmp(argv[1], "-4") = = 0) { family = PF_INET; argc--; argv++; } else if (argc > 1 && strcmp(argv[1], "-6") = = 0) { family = PF_INET6; argc--; argv++; } else family = PF_UNSPEC; memset(&hints, 0, sizeof(hints)); hints.ai_family = family; hints.ai_socktype = SOCK_STREAM; error = getaddrinfo(host, service, &hints, &res);
How Long Is a sockaddr?
One inconsistency in the sockets API is the presence or absence of a length
field as a common member of all sockaddr
structures. While we were busily
engaged in writing IPv4-only code, this wasn't really an issue; we
knew that functions like getpeername
would always return sizeof(struct
sockaddr_in
) bytes. When writing address-family agnostic code, this suddenly becomes a problem. So, how do ...
Get IPv6 Network Administration now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.