But I just want to know what to change in my code to get it going with IPv6! Tell me now!
Ok! Ok!
Almost everything in here is something I’ve gone over, above, but it’s the short version for the impatient. (Of course, there is more than this, but this is what applies to the guide.)
First of all, try to use getaddrinfo()
to get all the struct sockaddr
info, instead of packing the structures by hand. This will keep you IP version-agnostic, and will eliminate many of the subsequent steps.
Any place that you find you’re hard-coding anything related to the IP version, try to wrap up in a helper function.
Change AF_INET
to AF_INET6
.
Change PF_INET
to PF_INET6
.
Change INADDR_ANY
assignments to in6addr_any
assignments, which are slightly different:
struct sockaddr_in sa;
struct sockaddr_in6 sa6;
.sin_addr.s_addr = INADDR_ANY; // use my IPv4 address
sa.sin6_addr = in6addr_any; // use my IPv6 address sa6
Also, the value IN6ADDR_ANY_INIT
can be used as an initializer when the struct in6_addr
is declared, like so:
struct in6_addr ia6 = IN6ADDR_ANY_INIT;
Instead of struct sockaddr_in
use struct sockaddr_in6
, being sure to add “6” to the fields as appropriate (see struct
s, above). There is no sin6_zero
field.
Instead of struct in_addr
use struct in6_addr
, being sure to add “6” to the fields as appropriate (see struct
s, above).
Instead of inet_aton()
or inet_addr()
, use inet_pton()
.
Instead of inet_ntoa()
, use inet_ntop()
.
Instead of gethostbyname()
, use the superior getaddrinfo()
.
Instead of gethostbyaddr()
, use the superior getnameinfo()
(although gethostbyaddr()
can still work with IPv6).
INADDR_BROADCAST
no longer works. Use IPv6 multicast instead.
Et voila!