Your Browser is not longer supported

Please use Google Chrome, Mozilla Firefox or Microsoft Edge to view the page correctly
Loading...

{{viewport.spaceProperty.prod}}

Adresse mit Wildcards zuordnen (AF_INET, AF_INET6)

&pagelevel(4)&pagelevel

Wildcard-Adressen vereinfachen die lokale Adresszuordnung in den Internet-Domänen AF_INET und AF_INET6.

Internet-Adresse mit Wildcard zuordnen

Mit der Funktion bind() ordnen Sie einem Socket einen lokalen Namen (Adresse) zu. Dabei können Sie an Stelle einer konkreten Internet-Adresse auch INADDR_ANY (bei AF_INET) oder IN6ADDR_ANY (bei AF_INET6) als Internet-Adresse angeben. INADDR_ANY und IN6ADDR_ANY sind als feste Konstanten in <netinet.in.h> definiert.

Wenn Sie einem Socket s mit bind() einen Namen zuordnen, dessen Internet-Adresse mit INADDR_ANY oder IN6ADDR_ANY spezifiziert ist, bedeutet dies:

  • Der mit INADDR_ANY gebundene Socket s kann Nachrichten über alle IPv4-Netzwerk-Schnittstellen seines Rechners empfangen. Somit kann der Socket s alle Nachrichten empfangen, die an die Portnummer von s und eine beliebige gültige IPv4-Adresse des Rechners adressiert sind, auf dem der Socket s liegt. Hat der Rechner beispielsweise die IPv4-Adressen 128.32.0.4 und 10.0.0.78, so kann eine Task, welcher der Socket s zugeordnet ist, Verbindungsanforderungen annehmen, die an 128.32.0.4 und 10.0.0.78 adressiert sind.

  • Der mit IN6ADDR_ANY gebundene Socket s kann Nachrichten über alle IPv4- bzw. IPv6-Netzwerk-Schnittstellen seines Rechners empfangen. Somit kann der Socket s alle Nachrichten empfangen, die an die Portnummer von s und eine beliebige gültige IPv4- bzw. IPv6-Adresse des Rechners adressiert sind, auf dem der Socket s liegt. Hat der Rechner beispielsweise die IPv4- bzw. IPv6-Adressen 128.32.0.4 bzw.
    3FFE:1:1000:1000:52C1:D5FF:FE0E:2B01, so kann eine Task, welcher der Socket s zugeordnet ist, Verbindungsanforderungen annehmen, die an 128.32.0.4 und 3FFE:1:1000:1000:52C1:D5FF:FE0E:2B01 adressiert sind.

Die folgenden Beispiele zeigen, wie eine Task ohne Angabe einer Internet-Adresse einen lokalen Namen an einen Socket binden kann. Die Task muss lediglich die Portnummer spezifizieren:

 Bei AF_INET:

#include <sys.types.h>
#include <netinet.in.h>
#define MYPORT 2222
 ...
struct sockaddr_in sin;
int s;
 ...
s = socket(AF_INET, SOCK_STREAM, 0);
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = htonl(INADDR_ANY); 
sin.sin_port = htons(MYPORT);
bind(s, &sin, sizeof sin);

Bei AF_INET6:

#include <sys.types.h>
#include <netinet.in.h>
#define MYPORT 2222
 ...
struct in6_addr inaddr_any = IN6ADDR_ANY_INIT;
struct sockaddr_in6 sin6;
int s;
 ...
s = socket(AF_INET6, SOCK_STREAM, 0);
sin6.sin6_family = AF_INET6;
memcpy(sin6.sin6_addr.s6_addr, in6addr_any.s6_addr, 16);
sin6.sin6_port = htons(MYPORT);
bind(s, &sin6, sizeof sin6);

Portnummer mit Wildcard zuordnen

Ein lokaler Port kann unspezifiziert (Angabe 0) bleiben. In diesem Fall wählt das System für ihn eine passende Portnummer. Die folgenden Beispiele zeigen, wie eine Task einem Socket eine lokale Adresse zuordnet, ohne die lokale Portnummer zu spezifizieren:

 Bei AF_INET:

struct sockaddr_in sin;
...
s=socket(AF_INET, SOCK_STREAM,0);
sin.sin_family=AF_INET;
sin.sin_addr.s_addr=htonl(INADDR_ANY);
sin.sin_port = htons(0);
bind(s, &sin, sizeof sin);

 Bei AF_INET6:

struct sockaddr_in6 sin6;
struct in6_addr in6addr_any = IN6ADDR_ANY_INIT;
 ...
s = socket(AF_INET6, SOCK_STREAM, 0);
sin6.sin6_family = AF_INET6;
memcpy(sin6.sin6_addr.s6_addr,in6addr_any.s6_addr, 16);
sin6.sin6_port = htons(0); 
bind(s, &sin6, sizeof sin6);

Automatische Adresszuordnung durch das System

Auch wenn einem Socket noch keine Adresse zugeordnet ist, können Sie für den Socket eine Funktion aufrufen, die eigentlich einen gebundenen Socket voraussetzt (z.B. connect(), sendto() etc.). In diesem Fall führt das System für den betreffenden Socket einen impliziten bind()-Aufruf mit Wildcards für Internet-Adresse und Portnummer durch, d.h. der Socket wird mit INADDR_ANY auf alle IPv4-Adressen und mit IN6ADDR_ANY auf alle IPv6-Adressen und IPv4-Adressen des Rechners gebunden und erhält eine Portnummer aus einem freien Bereich.