/* CLIENT :
Uso:  client servername pid  */


#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <strings.h>




#define SERVERPORT 2222

main(int argc, char *argv[])
{
int     i,sock,pid,rval,status;
socklen_t length;
unsigned long delay;
struct  sockaddr_in     server,client,sender;
struct  hostent *hp,*gethostbyname();

 

  if(argc !=3)
    {     
      fprintf(stderr,"Uso: %s servername pid\n",argv[0]);
      exit(-1);
    }

  
  
  if((sock = socket(AF_INET,SOCK_DGRAM,0))<0)
    {
      perror("opening  datagram socket : ");
      exit(-2);
    }

  client.sin_family=      AF_INET;
  client.sin_addr.s_addr = INADDR_ANY;
  client.sin_port= htons(0);	/* La porta verra' assegnata dal sistema */


  if(bind(sock,(struct sockaddr *)&client,sizeof(client))<0)
    {
      perror("binding datagram socket : ");
      exit(-3);

    }


hp = gethostbyname(argv[1]);
if (hp == 0)
        {
        fprintf(stderr,"%s :host sconosciuto",argv[1]);
        exit(2);
        }

 bcopy( (char *)hp ->h_addr, (char *)&server.sin_addr,hp ->h_length);
 server.sin_family = AF_INET;
 server.sin_port = htons(SERVERPORT);

 pid = atoi(argv[2]); 		/* Il pid da terminare e' sulla linea di comando */

 sendto(sock,&pid,sizeof(pid),0,(struct sockaddr *)&server,sizeof(server));


 length = sizeof(sender);

 if(recvfrom(sock,&status,sizeof(status),0,(struct sockaddr *)&sender,&length)<0)
   {
     perror("recvfrom on datagram socket : ");
     exit(-3);
   }

 printf("Il server ha eseguito la terminazione del processo di PID %d con esito %s",pid,strerror(status));

   

}
