/*
 *	File	  : server.c
 *
 *	Title	  : Demo Client/Server.
 *
 *	Short	  : Example of a server using TCP protocol.	
 *
 *	Long 	  :
 *  
 *  Reference : W. Richard Stevens. "UNIX Network Programming".
 *              Prentice Hall Software Series. 1990.
 *              Chapter 6: Berkeley Sockets.
 *
 *	Author	  : Claudine Santos Badue.
 *
 *	Date	  : 28 August 2002.
 *
 *	Revised	  :
 */

#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
#include <unistd.h>

#define REQ_SIZE      10
#define RES_SIZE      100
#define SERV_TCP_PORT 2035

int main(int argc, char *argv[]){
    int sockfd, newsockfd;
    struct sockaddr_in serv_addr;
    char request[REQ_SIZE];
    char response[RES_SIZE];    
    
    /*
     * Open a TCP socket (an Internet stream socket).
     */    
    if ( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
        fprintf(stderr,"server: can't open stream socket\n");    
    /* 
     * Bind our local address so that the client can send to us.
     */    
    bzero((char *) &serv_addr, sizeof(serv_addr));
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    serv_addr.sin_port = htons(SERV_TCP_PORT);    
    if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0)
        fprintf(stderr,"server: can't bind local address\n");    
    listen(sockfd, 5);    
    for ( ; ; ){
        /* 
         * Wait for a connection from a client process.
         */        
        newsockfd = accept(sockfd, NULL, NULL);        
        if (newsockfd < 0)
            fprintf(stderr,"server: accept error\n");        
        /* 
         * Receive the request from the server.
         */         
        if (recv(newsockfd, (void *)request, REQ_SIZE, 0) != REQ_SIZE){
            fprintf(stderr,"server: can't receive request\n");    
            close(newsockfd);
            exit(1);
        }
        /* 
         * Process the request. 
         */
        process(request,response); 
        /* 
         * Send the response to the client. 
         */
        if (send(newsockfd, (void *)response, RES_SIZE, 0) != RES_SIZE){
            fprintf(stderr,"server: can't send response\n");    
            close(newsockfd);
            exit(1);
        }        
        close(newsockfd);    
    }
}
     
     

 
