Your Browser is not longer supported

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

{{viewport.spaceProperty.prod}}

Beispiele für eine verbindungsorientierte Client-/Server-Kommunikation

&pagelevel(5)&pagelevel

Die beiden folgenden Programmbeispiele zeigen, wie eine Streams-Verbindung in der Internet-Domäne vom Client initiiert und vom Server angenommen wird.

Beispiel 1: Initiieren einer Streams-Verbindung durch den Client

#include <sys.types.h>
#include <sys.socket.h>
#include <netinet.in.h>
#include <netdb.h> 
#include <stdio.h>
#include <stdlib.h>
#define DATA "Half a league, half a league . . ."
   
/*
 * Dieses Programm erzeugt einen Socket und initiiert eine Verbindung mit 
 * der in der Kommandozeile übergebenen Internet-Adresse.
 * Über die Verbindung wird eine Nachricht gesendet.
 * Dann wird der Socket geschlossen und die Verbindung beendet.
 * Das Client-Programm erwartet die Eingabe eines Rechnernamens und 
 * einer Portnummer. Es ist er Rechner, auf dem das Server-Programm läuft und 
 * die Portnummer des listen-sockets des Server-Programms (im Beispiel die 
 * Portnummer 2222). 
 */
   
main(argc, argv)
      int argc;
      char *argv[];
{
      int sock;
      struct sockaddr_in server;
      struct hostent *hp;
    
      /* Socket erzeugen. */
      sock = socket(AF_INET, SOCK_STREAM, 0);
      if (sock < 0) {
              perror("opening stream socket");
              exit(1);
      }
   
      /* Verbindungsaufbau unter Verwendung des in der Kommandozeile 
       * angegebenen Namens. 
       */
      server.sin_family = AF_INET;
      hp = gethostbyname(argv[1]);
      if (hp == 0) {
              fprintf(stderr, "%s: unknown host\n", argv[1]);
              exit(2);
      }
      memcpy((char *)&server.sin_addr, (char *)hp->h_addr,
        hp->h_length);
      server.sin_port = htons(atoi(argv[2]));
      if (connect(sock, (struct sockaddr*)&server, sizeof server) < 0) {
              perror("connecting stream socket");
              exit(1);
      }
      if (send(sock, DATA, sizeof DATA, 0) < 0)
              perror("writing on stream socket");
      soc_close(sock);
      exit(0);
}

   
Beispiel 2: Annehmen der Streams-Verbindung durch den Server

#include <sys.types.h>
#include <sys.socket.h>
#include <netinet.in.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#define TRUE 1
#define TESTPORT 2222
   
/*
 * Dieses Programm erzeugt einen Socket und geht dann in eine 
 * Endlos-Schleife. Bei jedem Schleifen-Durchlauf nimmt es eine 
 * Verbindung an und gibt Nachrichten von ihr aus.
 * Bricht die Verbindung ab oder wird eine Beendigungs-Nachricht 
 * übergeben, nimmt das Programm eine neue Verbindung an.
 */
   
main()
{
      int sock, length;
      struct sockaddr_in server, client;
      int msgsock;
      char buf[1024];
      int rval;
      /* Socket erzeugen. */
      sock = socket(AF_INET, SOCK_STREAM, 0);
      if (sock < 0) {
              perror("opening stream socket");
              exit(1);
      }
   
/* Dem Socket wird unter Verwendung von Wildcards ein Name zugeordnet. */
      server.sin_family = AF_INET;
      server.sin_addr.s_addr = htonl(INADDR_ANY);
      server.sin_port = htons(TESTPORT);
      if (bind(sock, (struct sockaddr*)&server, sizeof server ) < 0) {
              perror("binding stream socket");
              exit(1);
      }
   
      /* Beginn der Annahme von Verbindungswünschen. */
      listen(sock, 5);
      do {
              length = sizeof client;
              msgsock = accept(sock, (struct sockaddr*)&client, &length);
              if (msgsock == -1)
                      perror("accept");
              else do {
                      memset(buf, 0, sizeof buf );
                      if ((rval = recv(msgsock, buf, 1024, 0)) < 0)
                              perror("reading stream message");
                 else if (rval == 0)
                              printf("Ending connection\n");
                      else
                              printf("-->%s\n", buf); } 
              while (rval > 0);
              soc_close(msgsock);
      } while (TRUE);
   
      /*
       * Da dieses Programm in einer Endlos-Schleife läuft, wird der 
       * Socket "sock" niemals explizit geschlossen. 
       * Allerdings werden alle Sockets automatisch geschlossen, 
       * wenn eine Task abgebrochen wird oder ihr normales Ende erreicht.
       */
   
       exit(0);
}