next up previous contents
Next: 3.3.4 Senden und Empfangen Up: 3.3 Anwendungsentwicklung Previous: Einen Verbindungswunsch äußern

3.3.3 Auf einen Verbindungswunsch warten

Der Server, der den mit connect() geäußerten Verbindungswunsch erfolgreich beantworten soll, muß diesen erwarten. Dies erreicht er z.B. mit den drei Funktionen bind(), listen() und accept().

Mit bind() teilt man einem vorher mit socket() erzeugten Socket mit, zu welchem Port dieser gehört. Die Syntax lautet:

int bind(int socket , struct sockaddr *local_addr , int addrlen )

Die Parameter entsprechen denen der connect()-Funktion, mit dem Unterschied, daß der zweite Parameter local_addr die lokale Adresse enthält. Da ein Rechner mehrere Adressen besitzen kann, wird für IPv4 die symbolische Konstante INADDR_ANY zur Spezifikation einer ,,Wildcard``-Adresse angeboten. Die Funktion verbindet dann alle IP-Verbindungen mit dem angegebenen Port.

Da eine IPv6-Adresse durch eine Struktur in6_addr wie folgt dargestellt wird:

  #include <netinet/in.h>

  struct in6_addr {
      u_int8_t  s6_addr[16];      /* IPv6 address */
  }
kann man in Deklarationen eine Variable solchen Typs zwar mit einer symbolischen Konstante initialisieren, einer zuvor deklarierten in6_addr-Struktur aber nicht deren Wert zuweisen. Es werden deshalb zwei Möglichkeiten zur Zuweisung einer ,,Wildcard``-Adresse angeboten:
1.
Eine globale Variable in6addr_any:
  #include <netinet/in.h>:

  extern const struct in6_addr in6addr_any;
die in Zuweisungen ähnlich der symbolischen Konstante INADDR_ANY verwendet werden kann:
  /* Die sockaddr_in6 Struktur mit Wildcards fuellen */
  server.sin6_family = AF_INET6;
  server.sin6_addr = in6addr_any;
  server.sin6_port = 0;

  /* Socket an IP-Adresse und Port binden */
  if (bind(sock, (struct sockaddr *) &server, sizeof(server))) {
    perror("bind");
    exit(1);
  }
und
2.
eine symbolische Konstante IN6ADDR_ANY_INIT, die nur in Deklarationen zur Initialisierung dienen kann:
  struct in6_addr anyaddr = IN6ADDR_ANY_INIT;

listen() versetzt den Socket in einen passiven Modus und richtet eine Warteschlange ein, die die Beantwortung mehrerer gleichzeitig eintreffender Verbindungswünsche gestattet. Die Syntax:

int listen(int socket , int queuelen );

accept() erzeugt für jeden Verbindungswunsch einen neuen Socket, über den die Datenübertragung abgewickelt werden kann und hält den ursprünglichen Socket zur Annahme von weiteren Verbindungswünschen bereit. Die Syntax:

int accept(int socket , struct sockaddr *client_addr , int addrlen );
Die Parameter entsprechen denen der connect()-Funktion.


next up previous contents
Next: 3.3.4 Senden und Empfangen Up: 3.3 Anwendungsentwicklung Previous: Einen Verbindungswunsch äußern
Copyright Munich Network Management Team