#include "testEsfuerzo.h"

struct  sockaddr_in server;

void *connectThread(void *arg) {
  int  sd,aux;
  char buf[BUFSIZE];

  sd = socket (AF_INET,SOCK_STREAM,0);
  if (sd<0) {
    perror("opening stream socket");
    exit(-1);
  }
  /* Connect to TCP/SERVER */
  if ( connect(sd, (struct sockaddr *)&server, sizeof(server) ) < 0) {  
    close(sd);
    perror("connecting stream socket");
    exit(0);
  }
  //Se envia un numero aleatorio dado como argumento
  aux=(int) arg;
  sprintf(buf,"%d", aux);  
  if (send(sd, buf, sizeof(buf), 0) <0 )
    perror("sending stream message");
  close(sd); //Se cierra la conexion
  return((void *) 0);
}

main(int argc, char *argv[]) {
  struct  sockaddr_in addr;
  struct  hostent *hp;
  char str[INET_ADDRSTRLEN];
  int i=0,nthreads,aux;
  srand(time(NULL));

  //Verificamos la sintaxis
  if (argc != 4) {
    printf("Usar: testEsfuerzo <servidor_acumulador>");
    printf(" <puerto_votacion> <número_clientes_simulados>\n");
    exit(1);
  }	

  //Le podemos pasar el host o la ip
  if  ( (hp = gethostbyname(argv[1])) == NULL ) { //Intentamos con el host de argumento
    addr.sin_addr.s_addr = inet_addr(argv[1]); //no funciono, ahora buscamos por IP de argumento
    if ((hp = gethostbyaddr((void *)&addr.sin_addr.s_addr, sizeof(addr.sin_addr.s_addr),AF_INET)) == NULL) {
      fprintf(stderr, "Can't find host %s\n", argv[1]);
      exit(-1);
    }
  }    
  //Ahora rellenamos la direccion del server.
  bcopy (hp->h_addr, &(server.sin_addr), hp->h_length);
  server.sin_family = AF_INET;
  server.sin_port = htons(atoi(argv[2]));

  inet_ntop(AF_INET, &(server.sin_addr),str,INET_ADDRSTRLEN);
  printf("Connected to TCP/Server: ");
  printf("%s (%s:%d)\n", hp->h_name, str, ntohs(server.sin_port));

  //Creamos las hebras, cuya cantidad se especifica como argumento 3
  nthreads = atoi(argv[3]);
  pthread_t thread[nthreads];
  for(i = 0; i<nthreads; i++) {
   pthread_create(&thread[i], NULL, connectThread, rand() % 6); //Cada hebra se conecta
  }
  //Esperamos a todas las hebras creadas
  for(i = 0; i<nthreads; i++) {
    pthread_join(thread[i],NULL); 
  }
  printf("Done\n");
  exit(0);
}


