127700Smckusick .\" Copyright (c) 1986 Regents of the University of California.
227700Smckusick .\" All rights reserved.  The Berkeley software License Agreement
327700Smckusick .\" specifies the terms and conditions for redistribution.
427700Smckusick .\"
5*27883Skarels .\"	@(#)strchkread.c	6.2 (Berkeley) 05/08/86
627700Smckusick .\"
727700Smckusick #include <sys/types.h>
827700Smckusick #include <sys/socket.h>
9*27883Skarels #include <sys/time.h>
1027700Smckusick #include <netinet/in.h>
1127700Smckusick #include <netdb.h>
1227700Smckusick #include <stdio.h>
1327700Smckusick #define TRUE 1
1427700Smckusick 
1527700Smckusick /*
1627700Smckusick  * This program uses select() to check that someone is trying to connect
1727700Smckusick  * before calling accept().
1827700Smckusick  */
1927700Smckusick 
2027700Smckusick main()
2127700Smckusick {
22*27883Skarels 	int sock, length;
2327700Smckusick 	struct sockaddr_in server;
24*27883Skarels 	int msgsock;
25*27883Skarels 	char buf[1024];
26*27883Skarels 	int rval;
27*27883Skarels 	fd_set ready;
28*27883Skarels 	struct timeval to;
2927700Smckusick 
3027700Smckusick 	/* Create socket */
3127700Smckusick 	sock = socket(AF_INET, SOCK_STREAM, 0);
3227700Smckusick 	if (sock < 0) {
3327700Smckusick 		perror("opening stream socket");
34*27883Skarels 		exit(1);
3527700Smckusick 	}
3627700Smckusick 	/* Name socket using wildcards */
3727700Smckusick 	server.sin_family = AF_INET;
3827700Smckusick 	server.sin_addr.s_addr = INADDR_ANY;
3927700Smckusick 	server.sin_port = 0;
4027700Smckusick 	if (bind(sock, &server, sizeof(server))) {
4127700Smckusick 		perror("binding stream socket");
42*27883Skarels 		exit(1);
4327700Smckusick 	}
4427700Smckusick 	/* Find out assigned port number and print it out */
4527700Smckusick 	length = sizeof(server);
4627700Smckusick 	if (getsockname(sock, &server, &length)) {
4727700Smckusick 		perror("getting socket name");
48*27883Skarels 		exit(1);
4927700Smckusick 	}
5027700Smckusick 	printf("Socket has port #%d\en", ntohs(server.sin_port));
5127700Smckusick 
5227700Smckusick 	/* Start accepting connections */
5327700Smckusick 	listen(sock, 5);
5427700Smckusick 	do {
55*27883Skarels 		FD_ZERO(&ready);
56*27883Skarels 		FD_SET(sock, &ready);
5727700Smckusick 		to.tv_sec = 5;
58*27883Skarels 		if (select(sock + 1, &ready, 0, 0, &to) < 0) {
59*27883Skarels 			perror("select");
60*27883Skarels 			continue;
61*27883Skarels 		}
62*27883Skarels 		if (FD_ISSET(sock, &ready)) {
63*27883Skarels 			msgsock = accept(sock, (struct sockaddr *)0, (int *)0);
64*27883Skarels 			if (msgsock == -1)
65*27883Skarels 				perror("accept");
66*27883Skarels 			else do {
67*27883Skarels 				bzero(buf, sizeof(buf));
6827700Smckusick 				if ((rval = read(msgsock, buf, 1024)) < 0)
6927700Smckusick 					perror("reading stream message");
70*27883Skarels 				else if (rval == 0)
7127700Smckusick 					printf("Ending connection\en");
7227700Smckusick 				else
7327700Smckusick 					printf("-->%s\en", buf);
74*27883Skarels 			} while (rval > 0);
7527700Smckusick 			close(msgsock);
7627700Smckusick 		} else
7727700Smckusick 			printf("Do something else\en");
7827700Smckusick 	} while (TRUE);
7927700Smckusick }
80