Open Source im professionellen Einsatz

Gegenanzeigen

Eine Reihe von Funktionen sollte der Programmierer unbedingt vermeiden, wenn er IPv6-kompatible Software schreiben möchte. Das sind alle Funktionen, die eine »struct in_addr« als Parameter erwarten oder zurückliefern (siehe Listing 3). Für »inet_aton()« und »inet_ntoa()« , welche die numerische Ascii-Repräsentation und die »struct in_addr« ineinander umwandeln, gibt es die alternativen Funktionen »inet_pton()« und »inet_ntop()« , die einen zusätzlichen Parameter für die Adressenfamile erwarten und auch mit »in6_addr« -Strukturen umgehen können (Listing 4).

Listing 3

IPv6-inkompatible Funktionen

01     int inet_aton(const char *cp, struct in_addr *inp);
02     in_addr_t inet_addr(const char *cp);
03     in_addr_t inet_network(const char *cp);
04     char *inet_ntoa(struct in_addr in);
05     struct in_addr inet_makeaddr(int net, int host);
06     in_addr_t inet_lnaof(struct in_addr in);
07     in_addr_t inet_netof(struct in_addr in);

Listing 4

inet_pton und inet_ntop

01     int inet_pton(int af, const char *src, void *dst);
02     const char *inet_ntop(int af, const void *src,
03                           char *dst, socklen_t size);

Python

Python enthält seit Version 2.2 die Funktion »getaddrinfo()« im Standardmodul »socket« [4]. Die Umsetzung auf eine Skriptsprache ist hier gut gelungen, weil die hässliche Eigenschaft von C, unbenutzte Parameter in der »hints« - beziehungsweise »res« -Struktur zu haben, in Python entfällt. Die Funktion der Hints-Struktur aus dem C-Interface übernehmen in Python optionale Parameter:

socket.getaddrinfo(host, port,family=0,socktype=0, proto=0, flags=0)

Die notwendigen »AF_« - und »AI_« -Konstanten befinden sich ebenfalls im Socketmodul. Als Rückgabewert liefert »socket.getaddrinfo()« eine Liste von 5-Tupeln der folgenden Form zurück:

(family, socktype, proto, canonname, sockaddr)

Dabei sind die ersten drei Parameter jene, die der Programmierer an »socket.socket()« weitergeben kann, um ein Socketobjekt zu erstellen. Der »canonname« liefert den kanonischen Namen, falls über »flags« angefordert.

Der letzte Parameter »sockaddr« entspricht dem Feld »ai_addr« , Python liefert ihn als Tupel zurück, das je nach Adressenfamilie eine andere Länge besitzt. Der erste Eintrag dieser Tupel ist immer ein String, der aus der IP-Adresse in numerischer Notation besteht, der zweite Eintrag ist stets die Portnummer. Für IPv6 kommen noch die Einträge »flow info« und »scope id« hinzu. In beiden Fällen kann man diese Tupel als Parameter für die Socketmethoden »bind()« und »connect()« verwenden.

Diesen Artikel als PDF kaufen

Express-Kauf als PDF

Umfang: 7 Heftseiten

Preis € 0,99
(inkl. 19% MwSt.)

Als digitales Abo

Als PDF im Abo bestellen

comments powered by Disqus

Ausgabe 07/2013

Preis € 6,40

Insecurity Bulletin

Insecurity Bulletin

Im Insecurity Bulletin widmet sich Mark Vogelsberger aktuellen Sicherheitslücken sowie Hintergründen und Security-Grundlagen. mehr...

Linux-Magazin auf Facebook