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

#define REQUEST "GET /\n"
#define SOCKET_ERROR        -1
#define BUFFER_SIZE         100
#define HOST_NAME_SIZE      255

int main (int argc, char *argv[]) {
  int sock;
  int port;
  int k;
  char ip[20];
  struct sockaddr_in addr;
  char buf[1024];

  if (argc < 3) {
    printf ("\nUsage: ./client ip port\n");
    return 1;
  }
  else {
    strcpy(ip, argv[1]);
    sscanf(argv[2], "%d", &port);
  }

  sock = socket(AF_INET, SOCK_STREAM, 0);
  if (sock < 0) {
    perror ("\nCould not create socket\n");
    return 1;
  }

  addr.sin_addr.s_addr = inet_addr(ip);
  addr.sin_port = htons(port);
  addr.sin_family = AF_INET;

  if (connect (sock, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
    perror("\nCould not connect to host\n");
    return 1;
  }

  strcpy(buf, REQUEST);

  srand((unsigned)time(0));
  int toSend[3] = { rand() % 101, rand() % 101, rand() % 101 };
  int toReceive[3];
  int port_rcv;
  char ip_rcv[32];

  memset(ip_rcv, 0, sizeof(ip_rcv));

  printf("Client send: %d %d %d\n", toSend[0], toSend[1], toSend[2]);

  send(sock, &toSend, sizeof(toSend), 0);

  recv(sock, &toReceive, sizeof(toReceive), 0);
  recv(sock, &port_rcv, sizeof(port_rcv), 0);
  int i = 0;
  for(i = 0; i < sizeof(ip_rcv); ) {
    i += recv(sock, ip_rcv + i, sizeof(ip_rcv+i), 0);
  }

  printf("Client receive: %d %d %d\n", toReceive[0], toReceive[1], toReceive[2]);
  printf("From %s:%d\n", ip_rcv, port_rcv);

  if (close(sock) < 0) {
    perror("\nCould not close socket\n");
    return 1;
  }

  return 0;
}
