Loading...
Select Version
&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); }