#include <stdio.h>
#include <sys/time.h>

#include <sys/types.h>
#include <sys/param.h>
#include <sys/socket.h>
#include <sys/file.h>

#include <netinet/in_systm.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <netinet/ip_icmp.h>
#include <netdb.h>
#include <arpa/inet.h>

#include <string.h>
#include <stdlib.h>
#include <unistd.h>

#define BUFSIZE 32

int main (int argc, char *argv[]) {

    if (argc != 3) {
        if ( (argc == 2) && (strcmp(argv[1], "--help") == 0) ) {
            printf("Sintaxis:\n");
            printf("\t%s <servidor_acumulador> <puerto_monitor>\n\n", argv[0]);
            printf("Parametros:\n");
            printf("<servidor_acumulador>     Direccion IP del servidor acumulador\n");
            printf("<puerto_monitor>          Puerto en que el servidor recibe conexiones de monitores\n");
        }
        else {
            printf("Usage: %s <servidor_acumulador> <puerto_monitor>\n", argv[0]);
            printf("Try '%s --help' for more information\n", argv[0]);
        }
        exit(1);
    }

    int s, port, n;
    struct sockaddr_in serveraddr;
    struct hostent *server;
    char *hostname;
    char buf[BUFSIZE];
    int opt[6];
    int i;

    // Creacion y configuracion del socket para comunicarse con el servidor
    
    hostname = argv[1];
    port = atoi(argv[2]);

    s = socket(AF_INET, SOCK_STREAM, 0);
    if ( s < 0 )
        perror("ERROR opening socket");

    server = gethostbyname(hostname);
    if ( server == NULL ) {
        perror("ERROR, no such host");
        exit(0);
    }

    bcopy( server->h_addr, &(serveraddr.sin_addr), server->h_length);
    serveraddr.sin_family = AF_INET;
    serveraddr.sin_port = htons(port);

    // Estableciendo conexion con el servidor
    if ( connect(s, (struct sockaddr *) &serveraddr, sizeof(serveraddr)) < 0 )
        perror("ERROR connecting");

    bzero(buf, BUFSIZE);
    n = read(s, buf, BUFSIZE);
    if ( n < 0 )
        perror("ERROR reading from socket");

    // Leer la informacion recibida
    sscanf(buf, "%d %d %d %d %d %d", &opt[0], &opt[1], &opt[2], &opt[3], &opt[4], &opt[5]);

    // Desplegar las estadisticas con cada una de las opciones
    printf("Estadisticas:\n");
    for ( i = 0; i < 6; i++)
        printf("Opcion %d:\t%d\n", i, opt[i]);

    // Cerrar conexion
    close(s);
    return 0;
}
