Your Browser is not longer supported

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

{{viewport.spaceProperty.prod}}

Adressen 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 (siehe "Einem Socket einen Namen zuordnen"). Dabei können Sie an Stelle einer bestimmten 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, wirkt sich das folgendermaßen aus:

  • Nachrichten empfangen:

    • Der mit INADDR_ANY gebundene Socket s kann über alle IPv4-Netzwerk-Schnittstellen seines Rechners Nachrichten 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 Prozess, welchem der Socket s zugeordnet ist, Verbindungsanforderungen annehmen, die an 128.32.0.4 oder10.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 und 3FFE:0:0:0:A00:6FF:FE08:9A6B, so kann eine Task, welcher der Socket s zugeordnet ist, Verbindungsanforderungen annehmen, die an 128.32.0.4 oder 3FFE:0:0:0:A00:6FF:FE08:9A6B adressiert sind.

  • Nachrichten versenden:

    • Der mit INADDR_ANY gebundene Socket s kann Nachrichten über eine IPv4-fähige Netz-Schnittstelle seines Rechners verschicken.

    • Der mit IN6ADDR_ANY gebundene Socket s kann Nachrichten über eine beliebige Netz-Schnittstelle seines Rechners verschicken.

    Somit kann der mit INADDR_ANY gebundene Socket s jeden beliebigen anderen Socket adressieren, der über eine IPv4-fähige Netzwerk-Schnittstelle des Rechners erreichbar ist, auf dem der Socket s liegt.
    Der mit IN6ADDR-ANY gebundene Socket s kann hingegen jeden anderen Socket adressieren, der über eine beliebige Netzwerk-Schnittstelle des Rechners erreichbar ist, auf dem der Socket s liegt.

Die folgenden Beispiele zeigen, wie ein Prozess ohne Angabe einer Internet-Adresse einen lokalen Namen an einen Socket binden kann. Der Prozess 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);
memset(&sin6, 0 , sizeof sin6);
sin6.sin6_family = AF_INET6;
memcpy(sin6.sin6_addr.s6_addr,sin6addr_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);
memset(&sin6, 0 , sizeof sin6);
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);