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 .\"	@(#)strchkread.c	8.1 (Berkeley) 06/08/93
748154Sbostic .\"
827700Smckusick #include <sys/types.h>
927700Smckusick #include <sys/socket.h>
1027883Skarels #include <sys/time.h>
1127700Smckusick #include <netinet/in.h>
1227700Smckusick #include <netdb.h>
1327700Smckusick #include <stdio.h>
1427700Smckusick #define TRUE 1
1527700Smckusick 
1627700Smckusick /*
1727700Smckusick  * This program uses select() to check that someone is trying to connect
1827700Smckusick  * before calling accept().
1927700Smckusick  */
2027700Smckusick 
2127700Smckusick main()
2227700Smckusick {
2327883Skarels 	int sock, length;
2427700Smckusick 	struct sockaddr_in server;
2527883Skarels 	int msgsock;
2627883Skarels 	char buf[1024];
2727883Skarels 	int rval;
2827883Skarels 	fd_set ready;
2927883Skarels 	struct timeval to;
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 {
5627883Skarels 		FD_ZERO(&ready);
5727883Skarels 		FD_SET(sock, &ready);
5827700Smckusick 		to.tv_sec = 5;
5927883Skarels 		if (select(sock + 1, &ready, 0, 0, &to) < 0) {
6027883Skarels 			perror("select");
6127883Skarels 			continue;
6227883Skarels 		}
6327883Skarels 		if (FD_ISSET(sock, &ready)) {
6427883Skarels 			msgsock = accept(sock, (struct sockaddr *)0, (int *)0);
6527883Skarels 			if (msgsock == -1)
6627883Skarels 				perror("accept");
6727883Skarels 			else do {
6827883Skarels 				bzero(buf, sizeof(buf));
6927700Smckusick 				if ((rval = read(msgsock, buf, 1024)) < 0)
7027700Smckusick 					perror("reading stream message");
7127883Skarels 				else if (rval == 0)
7227700Smckusick 					printf("Ending connection\en");
7327700Smckusick 				else
7427700Smckusick 					printf("-->%s\en", buf);
7527883Skarels 			} while (rval > 0);
7627700Smckusick 			close(msgsock);
7727700Smckusick 		} else
7827700Smckusick 			printf("Do something else\en");
7927700Smckusick 	} while (TRUE);
8027700Smckusick }
81