Your Browser is not longer supported

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

{{viewport.spaceProperty.prod}}

Verbindungsorientierter Client

&pagelevel(3)&pagelevel

Die Seite des Servers wurde bereits im Beispiel in "Verbindungsorientierter Serve" dargestellt. Im Programmcode können Sie deutlich die separaten, asymmetrischen Rollen von Client und Server erkennen. Der Server wartet als passive Instanz auf Verbindungsanforderungen des Clients, während der Client als aktive Instanz eine Verbindung anstößt. Im Folgenden werden die Schritte näher betrachtet, die vom Client-Prozess durchgeführt werden.

Im Beispielprogramm verwendet der Client die folgenden Funktionen der Socket- bzw. POSIX-Schnittstelle:

  • socket(): Socket erzeugen

  • setsockopt(): Optionen für den Socket setzen

  • gethostbyname(): Rechnereintrag abfragen

  • connect(): auf dem Socket eine Verbindung anfordern

  • send(): Daten auf den Socket schreiben

  • close(): Socket schließen

Beispiel: Verbindungsorientierter Client

#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <sys/uio.h>
#define ERROR_EXIT(M) perror(M); exit(1)
#define TESTPORT 2222
#define DATA "Here's the message ..."
int main(int argc, char **argv)
{
    int                 sock, length;
    struct sockaddr_in  server;
    struct hostent     *hp, *gethostbyname();
    char                buf[1024];
    struct linger       ling;
    ling.l_onoff  = 1;
    ling.l_linger = 60;
    /* Socket erzeugen */
    if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
        ERROR_EXIT("Create stream socket");
    }
    /* Ausfüllen der Adress-Struktur */
    server.sin_family = AF_INET;
    server.sin_port = htons(TESTPORT);
    if ((hp = gethostbyname(argv[1])) == NULL) {
        fprintf(stderr,"%s: unknown host\n", argv[1]);
        exit(1);
    }
    /* Verbindung starten */
    memcpy((char *) &server.sin_addr, (char *)hp->h_addr, hp->h_length);
    if (connect(sock, (struct sockaddr *)&server, sizeof(server)) < 0) {
        ERROR_EXIT("Connect stream socket");
    }
    /* Auf den Socket schreiben */
    if (send(sock, DATA, sizeof DATA, 0) < 0) {
        ERROR_EXIT("Write on stream socket");
    }
    close(sock);
    return 0;
}

Der Client erzeugt mit der Funktion socket() einen Kommunikationsendpunkt (Socket) und den zugehörigen Deskriptor. Mit gethostbyname() ermittelt der Client die Adresse des Rechners (der Rechnername wird als Parameter übergeben). Danach wird eine Verbindung zum Server auf dem angegebenen Rechner hergestellt. Dazu initialisiert der Client die Adress-Struktur. Die Verbindung wird mit der Funktion connect() aufgebaut. Nach dem Verbindungsaufbau werden mit der Funktion send() Daten auf den Socket geschrieben. Mit der Funktion close() wird der Socket geschlossen.

Das Beispielprogramm ist nur für die Kommunikationsdomäne AF_INET gültig. Wenn es gemäß den Angaben in "Socket- Adressierung" und "Socket erzeugen" geändert wird, gilt es auch für die Domäne AF_INET6. Beachten Sie auch, dass Sie die Socket-Funktionen getaddrinfo() oder getipnodebyname() anstelle von gethostbyname() verwenden.