#include "socktools.h"
#include <memory.h>
#include <unistd.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/wait.h>

extern int PORT;
extern int NMAX;


int tache( struct sockaddr *client, int n )
{ int sd, res;
  sd = socket( AF_INET, SOCK_DGRAM, 0);
  sendpaquetto( sd,  client, n);
  res = recvpaquetfrom( sd, client );
  printfrom( client );
  fprintf(stdout, " dans fils %d  <- %d", getpid(), res);
  close(sd); 
  return res;
}

int sdcnet( int sd, int n )
{ int  somme = 0,  val, pid, status; 
  struct sockaddr  aux;
 
  while (  n  ) {
    val = recvpaquetfrom( sd, &aux );
    pid = fork();
    if ( pid == 0 ) { 
	  val = tache( &aux, n);
	  close(sd);
	  exit( val );
	};  
     n--;  
    }	 

   while ( ( pid = wait( &status ) ) > 0 ) {
    fprintf(stdout, "\nsignl du fils pid : %d", pid); 
    somme += WEXITSTATUS(status);    
  }
  
  return somme;
}


int main(int argc, char *argv[])
{ int   sd, res = 0;
  struct sockaddr_in serv; 
  if ( ! argok( argc, argv ) ) return 1;
  sd = socket( AF_INET, SOCK_DGRAM, 0);
  if ( sd < 0 ) erreur("socket");
  serv = sockaddrinlocal( PORT );
  if ( bind( sd, (struct sockaddr *) &serv, sizeof(serv)) < 0 )
    erreur("bind"); 
  res = sdcnet( sd, NMAX );
  printf("\nSomme %d premiers carres : %d\n", NMAX, res);
  fflush(stdout);
  close(sd);
  return 0;
}
