#include <arpa/inet.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <unistd.h>

int main(int argc, char *argv[]) {
  char valueToSend[256] = {'\0'};
  char valueToReceive[256] = {'\0'};
  char iterationsServer[256] = {'\0'};

  int iterations;
  printf("Inserire il numero di iterazioni: ");
  scanf("%d", &iterations);
  snprintf(iterationsServer, sizeof(iterationsServer), "%d", iterations);

  int simpleSocket = 0;
  int simplePort = 0;
  int returnStatus = 0;
  char buffer[256] = "";
  struct sockaddr_in simpleServer;

  if (argc != 3) {
    fprintf(stderr, "Usage: %s <server> <port>\n", argv[0]);
    exit(1);
  }

  /* create a streaming socket      */
  simpleSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

  if (simpleSocket == -1) {
    fprintf(stderr, "Could not create a socket!\n");
    exit(1);
  } else {
    fprintf(stderr, "Socket created!\n");
  }

  /* retrieve the port number for connecting */
  simplePort = atoi(argv[2]);

  /* setup the address structure */
  /* use the IP address sent as an argument for the server address  */
  // bzero(&simpleServer, sizeof(simpleServer));
  memset(&simpleServer, '\0', sizeof(simpleServer));
  simpleServer.sin_family = AF_INET;
  // inet_addr(argv[2], &simpleServer.sin_addr.s_addr);
  simpleServer.sin_addr.s_addr = inet_addr(argv[1]);
  simpleServer.sin_port = htons(simplePort);

  /*  connect to the address and port with our socket  */
  returnStatus = connect(simpleSocket, (struct sockaddr *)&simpleServer,
                         sizeof(simpleServer));

  if (returnStatus == 0) {
    fprintf(stderr, "Connect successful!\n");
  } else {
    fprintf(stderr, "Could not connect to address!\n");
    close(simpleSocket);
    exit(1);
  }

  // Inviando il numero di iterazioni al server
  write(simpleSocket, iterationsServer, strlen(valueToSend));

  for (int i = 0; i < iterations; ++i) {

    /* get the message from the server   */
    // returnStatus = read(simpleSocket, buffer, sizeof(buffer));

    printf("Inserire il valore da voler inviare al server: ");
    scanf("%s", valueToSend);
    write(simpleSocket, valueToSend, strlen(valueToSend));
    read(simpleSocket, valueToReceive, sizeof(valueToReceive));
    printf("\n\nEcho: %s\n", valueToReceive);
    close(simpleSocket);
  }

  close(simpleSocket);
  return 0;
}