Server and client combination
IPv4 <=> IPv4(most server and client)
IPv4 <=> IPv6
IPv6 <=> IPv4
IPv6 <=> IPv6
How IPv4 application and IPv6 application can
communicate with each other.
Host are running dual stacks, both an IPv4 protocol stack
and IPv6 protocol stack
IPv4 Client , IPv6 Server
IPv6 dual stack server can handle both IPv4 and IPv6
This is done using IPv4-mapped IPv6 address
server create an IPv6 listening socket that is bound to
the IPv6 wildcard address
Type0800 Dport 8888
IPv6 listening socket,
bound to 0::0, port 8888
IPv6 client, IPv4 server
IPv4 server start on an IPv4 only host and create an
IPv4 listening socket
IPv6 client start, call gethostbyname. IPv4 mapped
IPv6 address is returned.
Using IPv4 datagram
IPv6 Address Testing Macros
There are small class of IPv6 application that must
know whether they are talking to an IPv4 peer.
These application need to know if the peer’s address is
an IPv4-mapped IPv6 address.
Twelve macro defined(참조 page 267)
IPV6_ADDRFORM Socket Option
Can change a socket from one type to another,
An IPv4 socket can always be changed to an IPv6. Any
IPv4 address already associated with the socket are
converted to IPv4- mapped IPv6 address.
An IPv6 socket can changed to an IPv4 socket only if any
address already associated with the socket are IPv4-
mapped IPv6 address.
struct sockaddr_int6 cli; /* IPv6 struct */
struct hostent *ptr;
af = AF_INT6;
IPV6_ADDRFORM, &af, sizeof(af));
clilen = sizeof(cli);
Getpeername(0, &cli, &clilen);
ptr = gethostbyaddr(&cli.sin6_addr, 16, AF_INET);
Converting an IPv4 to IPv6
setsockopt => change the Address format of socket
from IPv4 to IPv6.
Return value is AF_INET or AF_INET6
getpeername =>return an IPv4-mapped IPv6
Source Code Portability
#ifdefs => hard to maintain, littered …
use getaddrinfo and getnameinfo