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