/*****************************************************************************/
/* Simple TCP client                                                         */
/*                                                                           */
/* The client get the following input:                                       */
/*   * Address / name of the host which runs the server                      */
/*                                                                           */
/*                                                                           */
/* Process:                                                                  */
/*   The clients resolves server name (no resolution is needed for address)  */
/*   Conenction with the server                                              */
/*   Passing the message to the server                                       */
/*                                                                           */
/* Termination:                                                              */
/*   Close the connection as needed                                          */
/*                                                                           */
/*                                                                           */
/*                                                                           */
/* The source is taken from Beej's Guide to Network Programming              */
/*                                                                           */
/*                                                                           */
/*                                                                           */
/*****************************************************************************/

void signal_pipe(int signo); 

    #include <stdio.h> 
    #include <stdlib.h> 
    #include <errno.h> 
    #include <string.h> 
    #include <netdb.h> 
    #include <sys/types.h> 
    #include <netinet/in.h> 
    #include <sys/socket.h> 
    #include <signal.h>

    #define PORT 3490           /* the port client will be connecting to */

    #define MAXDATASIZE 100     /* max number of bytes we can get at once */

    int main(int argc, char *argv[])
    {
        int                     sockfd, numbytes;       /*Socket file descriptor & bystes sent  */
        char                    buf[MAXDATASIZE];       /*The string to be passed               */
        struct  hostent         *he;                    /*Is needed for address resolution      */
        struct  sockaddr_in     their_addr;             /* connector's address information      */
	
        if (argc != 2) {                                /*If not enaugh parameters were passed */
            fprintf(stderr,"usage: client hostname\n");
            exit(1);
        }

        if ((he=gethostbyname(argv[1])) == NULL) {      /* Host name resolution                 */
            herror("gethostbyname");
            exit(1);
        }

        if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { /*Define the Internet socket,TCP*/
            perror("socket");
            exit(1);
        }

        their_addr.sin_family = AF_INET;                        /*Host byte order               */
        their_addr.sin_port = htons(PORT);                      /*Short, network byte order     */
        their_addr.sin_addr = *((struct in_addr *)he->h_addr);  /*Assign address of the server  */
        bzero(&(their_addr.sin_zero), 8);                       /*Zero the rest of the struct   */

        /*Connecting the server         */
	signal (SIGPIPE, signal_pipe);
        if (connect(sockfd, (struct sockaddr *)&their_addr, \
                                              sizeof(struct sockaddr)) == -1) {
            perror("connect");
            exit(1);
        }

while(1){
        if ((numbytes=recv(sockfd, buf, MAXDATASIZE, 0)) == -1) {/*Recieve infor from the server*/
            perror("recv");
            exit(1);
        }

        buf[numbytes] = '\0'; /*The info from the server has no \0 at the end of string         */

        printf("Received: %s",buf);
        if (send(sockfd, "Hello-client!\n", 14, 0) == -1){
            perror("send");
            exit(0);
         }
 
}

        close(sockfd);

        return 0;
    }


void signal_pipe(int signo)
{

        printf("INTERUPT signal - SIGPIPE\n");
        return;
}