|  | Linux Application Development | Michael K. Johnson Erik W. Troan | 
/* tserver.c - simple server for TCP/IP sockets */
/* Waits for a connection on port 1234. Once a connection has been
   established, copy data from the socket to stdout until the other 
   end closes the connection, and then wait for another connection to 
   the socket. */
#include <arpa/inet.h>
#include <netinet/in.h>
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <unistd.h>
#include "sockutil.h"          /* some utility functions */
int main(void) {
    struct sockaddr_in address;
    int sock, conn, i;
    size_t addrLength = sizeof(struct sockaddr_in);
    if ((sock = socket(PF_INET, SOCK_STREAM, 0)) < 0)
        die("socket");
    /* Let the kernel reuse the socket address. This lets us run
       twice in a row, without waiting for the (ip, port) tuple
       to time out. */
    i = 1;					
    setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &i, sizeof(i)); 
    address.sin_family = AF_INET;
    address.sin_port = htons(1234);
    memset(&address.sin_addr, 0, sizeof(address.sin_addr));
    if (bind(sock, (struct sockaddr *) &address, sizeof(address)))
        die("bind");
    if (listen(sock, 5))
        die("listen");
    while ((conn = accept(sock, (struct sockaddr *) &address, 
                          &addrLength)) >= 0) {
        printf("---- getting data\n");
        copyData(conn, 1);
        printf("---- done\n");
        close(conn);
    }
    if (conn < 0) 
        die("accept");
    
    close(sock);
    return 0;
}