#include     <stdio.h>
#include     <stdlib.h>
#include     <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>	/* rete internet */
#include <errno.h>

void err_fatal(char *mes);
extern int errno;

void
showAddr (char *msg, struct sockaddr_in *saddr)
{
  char *ptr_addr = &(saddr->sin_addr.s_addr);
  printf ("%s %u.%u.%u.%u:%u\n", msg, (unsigned char) ptr_addr[0],
	  (unsigned char) ptr_addr[1], (unsigned char) ptr_addr[2],
	  (unsigned char) ptr_addr[3], ntohs (saddr->sin_port));
}

int
main (int argc, char **argv)
{

  char buf[80];
  /*char tc, rc;			/* tx/rx character */
  char rc[1024];
  unsigned long taddr_n, taddr_h;	/* IP addr.(netwk/host byte order) */
  unsigned short tport_n, tport_h;	/* port number */
  struct sockaddr_in saddr;	/* server address */
  int s;
  int result;

  if (argc < 2) {
    fprintf (stderr, "Provide: host address (dotted notation)\n");
    return 1;
  }

  taddr_n = inet_addr (argv[1]);
  taddr_h = ntohl (taddr_n);

  if(argc>2){
	  tport_h = atoi(argv[2]);
  }else{
	  tport_h = 37;			/* time service */
  }
  tport_n = htons (tport_h);

  /* creazione del socket */
  printf ("Creating socket\n");
  s = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP);
  if (s == -1)
    err_fatal ("socket() failed");
  printf ("done. Socket number: %d\n", s);

  /* preparazione dell'indirizzo */
  saddr.sin_family = AF_INET;
  saddr.sin_port = tport_n;
  saddr.sin_addr.s_addr = taddr_n;

  /* connessione */
  showAddr ("Connecting to target address ", &saddr);
  result = connect (s, (struct sockaddr *) &saddr, sizeof (saddr));
  if (result == -1)
    err_fatal ("connect() failed");
  printf ("done.\n");

  printf ("waiting for response...\n");
  memset(rc,0,sizeof(rc));
  result = recv (s, rc, sizeof (rc), 0);
  if (result <= 0) {
    printf ("Read error/Connection closed\n");
    close (s);
    return 3;
  }
  else {
    printf ("Received response from socket %03u : \n[%s]\n", s, rc);
  }


  close(s);

  return 0;
}

void err_fatal(char *mes) {
	printf("%s, errno=%d\n", mes, errno);
	perror(""); exit(1);
}

