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