1*62785Sbostic .\" Copyright (c) 1986, 1993
2*62785Sbostic .\"	The Regents of the University of California.  All rights reserved.
348154Sbostic .\"
448154Sbostic .\" %sccs.include.redist.roff%
548154Sbostic .\"
6*62785Sbostic .\"	@(#)streamread.c	8.1 (Berkeley) 06/08/93
748154Sbostic .\"
827700Smckusick #include <sys/types.h>
927700Smckusick #include <sys/socket.h>
1027700Smckusick #include <netinet/in.h>
1127700Smckusick #include <netdb.h>
1227700Smckusick #include <stdio.h>
1327700Smckusick #define TRUE 1
1427700Smckusick 
1527700Smckusick /*
1627700Smckusick  * This program creates a socket and then begins an infinite loop. Each time
1727700Smckusick  * through the loop it accepts a connection and prints out messages from it.
1827700Smckusick  * When the connection breaks, or a termination message comes through, the
1927700Smckusick  * program accepts a new connection.
2027700Smckusick  */
2127700Smckusick 
2227700Smckusick main()
2327700Smckusick {
2427883Skarels 	int sock, length;
2527700Smckusick 	struct sockaddr_in server;
2627883Skarels 	int msgsock;
2727883Skarels 	char buf[1024];
2827883Skarels 	int rval;
2927883Skarels 	int i;
3027700Smckusick 
3127700Smckusick 	/* Create socket */
3227700Smckusick 	sock = socket(AF_INET, SOCK_STREAM, 0);
3327700Smckusick 	if (sock < 0) {
3427700Smckusick 		perror("opening stream socket");
3527883Skarels 		exit(1);
3627700Smckusick 	}
3727700Smckusick 	/* Name socket using wildcards */
3827700Smckusick 	server.sin_family = AF_INET;
3927700Smckusick 	server.sin_addr.s_addr = INADDR_ANY;
4027700Smckusick 	server.sin_port = 0;
4127700Smckusick 	if (bind(sock, &server, sizeof(server))) {
4227700Smckusick 		perror("binding stream socket");
4327883Skarels 		exit(1);
4427700Smckusick 	}
4527700Smckusick 	/* Find out assigned port number and print it out */
4627700Smckusick 	length = sizeof(server);
4727700Smckusick 	if (getsockname(sock, &server, &length)) {
4827700Smckusick 		perror("getting socket name");
4927883Skarels 		exit(1);
5027700Smckusick 	}
5127700Smckusick 	printf("Socket has port #%d\en", ntohs(server.sin_port));
5227700Smckusick 
5327700Smckusick 	/* Start accepting connections */
5427700Smckusick 	listen(sock, 5);
5527700Smckusick 	do {
5627700Smckusick 		msgsock = accept(sock, 0, 0);
5727883Skarels 		if (msgsock == -1)
5827883Skarels 			perror("accept");
5927883Skarels 		else do {
6027883Skarels 			bzero(buf, sizeof(buf));
6127700Smckusick 			if ((rval = read(msgsock, buf, 1024)) < 0)
6227700Smckusick 				perror("reading stream message");
6327700Smckusick 			i = 0;
6427700Smckusick 			if (rval == 0)
6527700Smckusick 				printf("Ending connection\en");
6627700Smckusick 			else
6727700Smckusick 				printf("-->%s\en", buf);
6827700Smckusick 		} while (rval != 0);
6927700Smckusick 		close(msgsock);
7027700Smckusick 	} while (TRUE);
7127700Smckusick 	/*
7227700Smckusick 	 * Since this program has an infinite loop, the socket "sock" is
7327700Smckusick 	 * never explicitly closed.  However, all sockets will be closed
7427700Smckusick 	 * automatically when a process is killed or terminates normally.
7527700Smckusick 	 */
7627700Smckusick }
77