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(4)&pagelevel

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

Die Beispielprogramme sind nur für die Kommunikationsdomäne AF_INET ausgeführt, bei Änderungen entsprechend den Abschnitten "Socket-Adressierung" und "Socket erzeugen" gelten sie auch für die Domäne AF_INET6.

Beispiel 1: Initiieren einer Streams-Verbindung durch den Client

Dieses Programm erzeugt einen Socket und initiiert eine Verbindung mit dem in der Kommandozeile übergebenen Socket. Über die Verbindung wird eine Nachricht gesendet. Dann wird der Socket geschlossen und die Verbindung beendet.

Der Programmaufruf lautet: programmname rechnername portnummer

#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
#define DATA "Half a league, half a league . . ."
int main(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 angegebenen Namen. */
    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");
    close(sock);
    exit(0);
} 

Beispiel 2: Annehmen der Streams-Verbindung durch den Server

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. Da dieses Programm in einer Endlos-Schleife läuft, wird der Socket niemals explizit geschlossen. Allerdings werden alle Sockets automatisch geschlossen, wenn ein Prozess abgebrochen wird oder sein normales Ende erreicht.

#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
#define TRUE 1
#define TESTPORT 2222
int main(int argc, char **argv)
{
    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);
    }
    /* Der Socket-Name wird unter Verwendung von Wildcards zugewiesen. */
    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);
    }
    /* Zugehörige Portnummer herausfinden und ausgeben. */
    length = sizeof server;
    if (getsockname(sock, (struct sockaddr *)&server, &length) < 0) {
        perror("getting socket name");
        exit(1);
    }
    printf("Socket port #%d\n", ntohs(server.sin_port));
    /* 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);
        close(msgsock);
    } while (TRUE);
    /* NOTREACHED */
    exit(0);
}