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.