#include "socktools.h"
#include <memory.h>
#include <unistd.h>
#include <signal.h>
extern int PORT;
extern int NMAX;


void tache( int tube, struct sockaddr *client, int n )
{ int sd, res;
  int nb;
  sd = socket( AF_INET, SOCK_DGRAM, 0);
  sendpaquetto( sd,  client, n);
  res = recvpaquetfrom( sd, client );
  printfrom( client );
  printf(" in child -> %d", res);
  close(sd); 
  nb = write( tube, &res, 4 );
  if ( nb < 0) erreur("write");
}

int sdcnet( int sd, int n )
{ int  somme = 0,  val, nbfils = 0; 
  struct sockaddr  aux;
  int pid, pfd[2];
  if ( pipe( pfd ) < 0) erreur("pipe");
  signal(SIGCHLD, SIG_IGN);
  while (  n  ) {
    val = recvpaquetfrom( sd, &aux );
    pid = fork();
    if ( pid == 0 ) { 
	  close( pfd[0] ); close( sd );
	  tache( pfd[1], &aux, n);
	  close( pfd[1] );    exit(0);
	};  
     n--;  nbfils++;
    }	 
  while ( nbfils ) {
    printf("\nfils %d ?", nbfils);
    read( pfd[0], &val, 4 );
    somme += val;       nbfils--;
  }
  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", NMAX, res);
  fflush(stdout);
  close(sd);
  return 0;
}
