11.23 Netzwerksoftware nach IPv6 portieren
Sie finden hier eine kurze Zusammenfassung über das Vorgehen, wie Sie Software von IPv4 nach IPv6 portieren können.
Im Großen und Ganzen muss zum Glück nicht die Welt verändert werden, da ja mit IPv6 lediglich die Socket-API erweitert wurde. Im Detail wurden einige neue Konstanten eingeführt, Strukturen umbenannt und erweitert und auch neue Funktionen hinzugefügt.
11.23.1 Konstanten
Die IPv4-Konstanten AF_INET bzw. PF_INET wurden durch AF_INET6 bzw. PF_INET6 ersetzt. Es muss hierbei eigentlich nur die Konstante um eine 6 erweitert werden. Es ist allerdings kein Fehler, wenn Sie auch bei einer IPv4-Software gleich die neuen Konstanten verwenden, da ein Programm, das auf IPv6 portiert wurde, auch weiterhin auf IPv4-Rechnern läuft (vorausgesetzt, der Rechner ist »dual-stacked«, was in Zukunft bei IPv6-fähigen Rechnern immer der Fall sein sollte).
Was sich auch verändert hat, ist die Konstante INADDR_ANY, die beim Binden von Sockets an einen Port angegeben wird, und die bedeutet, dass Pakete von jedem Interface angenommen werden. Ein wenig ungewöhnlich ist, dass die neue Konstante kleingeschrieben wird – in6addr_any. Der Grund hierfür: Die alte Struktur in_addr bestand nur aus einem »unsigned long int s_addr«, und somit war die Konstante INADDR_ANY auch nur eine Zahl. Da die Adresse bei IPv6 128 Bit breit ist, ist dies nicht mehr möglich (da kein portabler Datentyp mit dieser Breite existiert), weshalb es sich nun um ein Array handelt:
struct in6_addr {
union {
uint8_t u6_addr8[16];
uint16_t u6_addr16[8];
uint32_t u6_addr32[4];
} in6_u;
#define s6_addr in6_u.u6_addr8
#define s6_addr16 in6_u.u6_addr16
#define s6_addr32 in6_u.u6_addr32
};
11.23.2 Strukturen
Nachdem in_addr durch in6_addr ersetzt wurde (s. o.), ist es auch nötig, die Struktur sockaddr_in anzupassen:
struct sockaddr_in6 {
sa_family_t sin6_family // Address family - AF_INET6
in_port_t sin6_port; // Transport layer port #
uint32_t sin6_flowinfo; // IPv6 flow information */
struct in6_addr sin6_addr; // IPv6 address
uint32_t sin6_scope_id; // IPv6 scope-id
};
Außer dass die Adressstruktur verändert wurde, wurden noch die zusätzlichen Strukturvariablen sin6_flowinfo und sin6_scope_id hinzugefügt.
11.23.3 Funktionen
Der Großteil der Socket-API-Funktionen ist gleich geblieben. Verändert (hinzugefügt) wurden lediglich die meisten Adressauflösungs- und Konvertierungsfunktionen. So werden die Funktionen (wurde bereits im Buch erwähnt) inet_aton() bzw. inet_ntoa() durch die Funktionen inet_pton() bzw. inet_ntop() ersetzt. Da diese neuen Funktionen jetzt nicht mehr auf Zahlen operieren, sondern auf den konkreten Adressstrukturen (z. B. in6_addr), unterstützen sie somit auch beliebige Adressfamilien.
Noch wichtiger sind die neu hinzugekommenen Funktionen getaddrinfo() und getnameinfo(). Diese wurden als Ersatz für die Funktionen gethostbyname()/gethostbyaddr() und getipnodebyname()/getipnodebyaddr() eingeführt und haben den Vorteil, dass sie direkt sockaddr-Strukturen bearbeiten. Des Weiteren wurde noch die Funktion gethostbyname2() hinzugefügt, wobei es sich allerdings nur um eine reine GNU-Extension handelt!
Hinweis All diese Funktionen stehen Ihnen übrigens auch schon für IPv4 zur Verfügung, weshalb es nicht falsch sein kann, diese jetzt schon zu verwenden, um eine eventuell spätere Portierung zu erleichtern.
|
|