1*27700Smckusick .\" Copyright (c) 1986 Regents of the University of California. 2*27700Smckusick .\" All rights reserved. The Berkeley software License Agreement 3*27700Smckusick .\" specifies the terms and conditions for redistribution. 4*27700Smckusick .\" 5*27700Smckusick .\" @(#)streamread.c 6.1 (Berkeley) 05/04/86 6*27700Smckusick .\" 7*27700Smckusick #include <sys/types.h> 8*27700Smckusick #include <sys/socket.h> 9*27700Smckusick #include <netinet/in.h> 10*27700Smckusick #include <netdb.h> 11*27700Smckusick #include <stdio.h> 12*27700Smckusick #define TRUE 1 13*27700Smckusick 14*27700Smckusick /* 15*27700Smckusick * This program creates a socket and then begins an infinite loop. Each time 16*27700Smckusick * through the loop it accepts a connection and prints out messages from it. 17*27700Smckusick * When the connection breaks, or a termination message comes through, the 18*27700Smckusick * program accepts a new connection. 19*27700Smckusick */ 20*27700Smckusick 21*27700Smckusick main() 22*27700Smckusick { 23*27700Smckusick int sock, length; 24*27700Smckusick struct sockaddr_in server; 25*27700Smckusick int msgsock; 26*27700Smckusick char buf[1024]; 27*27700Smckusick int rval; 28*27700Smckusick int i; 29*27700Smckusick 30*27700Smckusick /* Create socket */ 31*27700Smckusick sock = socket(AF_INET, SOCK_STREAM, 0); 32*27700Smckusick if (sock < 0) { 33*27700Smckusick perror("opening stream socket"); 34*27700Smckusick exit(0); 35*27700Smckusick } 36*27700Smckusick /* Name socket using wildcards */ 37*27700Smckusick server.sin_family = AF_INET; 38*27700Smckusick server.sin_addr.s_addr = INADDR_ANY; 39*27700Smckusick server.sin_port = 0; 40*27700Smckusick if (bind(sock, &server, sizeof(server))) { 41*27700Smckusick perror("binding stream socket"); 42*27700Smckusick } 43*27700Smckusick /* Find out assigned port number and print it out */ 44*27700Smckusick length = sizeof(server); 45*27700Smckusick if (getsockname(sock, &server, &length)) { 46*27700Smckusick perror("getting socket name"); 47*27700Smckusick exit(0); 48*27700Smckusick } 49*27700Smckusick printf("Socket has port #%d\en", ntohs(server.sin_port)); 50*27700Smckusick 51*27700Smckusick /* Start accepting connections */ 52*27700Smckusick listen(sock, 5); 53*27700Smckusick do { 54*27700Smckusick msgsock = accept(sock, 0, 0); 55*27700Smckusick do { 56*27700Smckusick for (i = 0; i < 1024; i++) 57*27700Smckusick buf[i] = '\e0'; 58*27700Smckusick if ((rval = read(msgsock, buf, 1024)) < 0) 59*27700Smckusick perror("reading stream message"); 60*27700Smckusick i = 0; 61*27700Smckusick if (rval == 0) 62*27700Smckusick printf("Ending connection\en"); 63*27700Smckusick else 64*27700Smckusick printf("-->%s\en", buf); 65*27700Smckusick } while (rval != 0); 66*27700Smckusick close(msgsock); 67*27700Smckusick } while (TRUE); 68*27700Smckusick /* 69*27700Smckusick * Since this program has an infinite loop, the socket "sock" is 70*27700Smckusick * never explicitly closed. However, all sockets will be closed 71*27700Smckusick * automatically when a process is killed or terminates normally. 72*27700Smckusick */ 73*27700Smckusick } 74