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