#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( int dt, struct sockaddr *client, int n )
{ int sd, res, nb;
  sd = socket( AF_INET, SOCK_DGRAM, 0);
  sendpaquetto( sd,  client, n);
  res = recvpaquetfrom( sd, client );
  fprintf(stdout, "\nfils %d  <- %d", getpid(), res);
  printfrom( client );
  nb = write( dt, &res, 4 );
  if ( nb != 4 ) erreur("write"); 
  close(sd); 
  return res;
}

int sdcnet( int sd, int n )
{ int  somme = 0, val, nb, status; 
  struct sockaddr  aux;
  int pid, tube[2];
  if ( pipe( tube ) < 0) erreur("pipe");
  while (  n  ) {
    val = recvpaquetfrom( sd, &aux );
    pid = fork();
    if ( pid == 0 ) { 
	  close( tube[0] );
	  tache( tube[1], &aux, n);
	  close( tube[1] ); close(sd); exit( 0 );
	};  
     n--;
    }	
   while ( ( pid = wait( &status ) ) >= 0 ) {
    fprintf(stdout, "\nsignal du fils pid = %d", pid); 
    nb = read( tube[0], &val, 4 );
    if ( nb != 4 )  erreur("read");
    somme += val;       
   }
  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;
}
