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);
}