Zcela nevyhnutelné byly změny adresových struktur definovaných v hlavičkovém souboru //netinet/in.h//. Pro IPv6 se zavádí nová adresová rodina //(address family)// ''AF_INET6''. Tato konstanta má z praktických důvodů přiřazenu stejnou číselnou hodnotu jako ''PF_INET6'' (viz //bits/socket.h//):
#define AF_INET6 PF_INET6
Dříve se totiž obvykle kategorie konstant ''AF_'' a ''PF_'' vcelku libovolně zaměňovaly, RFC 3493 ale již důsledně respektuje jejich sémantickou odlišnost.
Původní API používá pro zápis adres IPv4 strukturu ''in_addr'' definovanou v Linuxu takto:
typedef uint32_t in_addr_t;
struct in_addr
{
in_addr_t s_addr;
};
Jak je vidět, ve své podstatě jde pouze o obal pro číslo typu ''unsigned long''. Obdobná struktura pro adresy IPv6 je už složitější, v prvním přiblížení si ji můžeme představit takto:
struct in6_addr
{
uint8_t s6_addr[16];
};
Ve skutečnosti, podíváte-li se do hlavičkového souboru //netinet/in.h//, zjistíte, že deklarace je ještě složitější z důvodu efektivního zarovnání struktury na hranici slova pro všechny typy mikroprocesorových architektur. Těmito technickými detaily se však nebudeme zabývat.
Zajímavější je situace u adres soketů. Hlavní funkce //BSD Sockets// se používají univerzálně pro všechny rodiny protokolů. Adresy soketů se jim proto musí předávat v jednotné formě, tedy prostřednictvím neprůhledných //(opaque)// ukazatelů na abstraktní strukturu ''sockaddr''. Ukazatele na struktury soketových adres konkrétních rodin protokolů je tudíž třeba pro tento účel přetypovat.
Adresy klasických internetové soketů se skládají, jak víme, z dvojice (IP adresa, TCP/UDP port). Příslušná struktura ''sockaddr_in'' je definována takto:
struct sockaddr_in
{
unsigned short int sin_family; /* Address family */
uint16_t sin_port; /* Port number */
struct in_addr sin_addr; /* Internet address */
unsigned char sin_zero[8]; /* Padding */
};
Její délka je pomocí 8 bajtů vaty //(padding)// dorovnána na velikost abstraktní struktury ''sockaddr''. Tuto rezervu si zřejmě designéři //BSD Sockets// ponechávali pro budoucí verze protokolu IP. Jak se zdá, ani ve snu je nenapadlo, že by se měla délka IP adresy dostat až na 128 bitů. Nicméně stalo se a do ''sockaddr_in'' se už nevejde ani samotná adresa IPv6. Proto se rovněž musela definovat nová struktura pro adresu soketu IPv6:
struct sockaddr_in6
{
unsigned short int sin6_family; /* Address family */
uint16_t sin6_port; /* Port number */
uint32_t sin6_flowinfo; /* Traffic class&flow info */
struct in6_addr sin6_addr; /* IPv6 address */
uint32_t sin6_scope_id; /* IPv6 scope-id */
};
Vidíme zde i další nové položky:
* ''sin6_flowinfo'' obsahuje údaje ze dvou polí hlavičky IPv6: //třída provozu (traffic class)// a //značka toku (flow label)//.
* ''sin6_scope_id'' určuje síťová rozhraní patřící do stejného dosahu //(address scope)// jako použitá adresa.
Pro pořádek ještě dodejme, že všechny vícebajtové položky struktur (včetně šestnáctibajtové adresy IPv6) je nutno ukládat v tzv. //síťovém pořadí bajtů (NBO--Network Byte Order)//, který se v kontextu mikroprocesorových architektur nazývá //big endian//. Na strojích s procesory Intel (i jiných) proto musíme vždy použít konverzní funkce ''htonl()'' nebo ''htons()''.