/*
 */

#include  #include  #include  
#include  #include  #include  #include  #include  
void fin_hijo() {
	wait(0);
	printf("Un cliente menos\n");
	signal(SIGCHLD,fin_hijo);
}

int main(int argc,char *argv[]) {
	int sock,c_sock;
	int puerto;
	struct sockaddr_in servidor,cliente;
	char buf[20000];
	FILE *f;
        	
	signal(SIGCHLD,fin_hijo);

	if (argc<=1) {
		puerto=1234;
	} else {
		sscanf(argv[1],"%d",&puerto);
	}

	/* Abrimos el socket */
	sock=socket(PF_INET,SOCK_STREAM,0);

	/* Rellenamos la estructura para pedir puerto */
	servidor.sin_family=AF_INET;
	servidor.sin_port=htons(puerto);
	servidor.sin_addr.s_addr=INADDR_ANY;
	if (bind(sock,(struct sockaddr *)&servidor,sizeof(servidor))==-1) {
		printf("Error!! no puedo coger el puerto!!!\n");
		exit(-1);
	}
	
	listen(sock,5);
	
	while (1) {
		int dirlen=sizeof(cliente);
		int leidos;
		int pid;
		
		c_sock=accept(sock,(struct sockaddr *)&cliente,&dirlen);
		
		printf("Cliente en %x\n",ntohl(cliente.sin_addr.s_addr));

		pid=fork();
		if (pid==0) {
                        f = fdopen(c_sock,"w+");
                        while ( fgets(buf,20000,f) ) {
                                printf("retransmitiendo: %s",buf);
                                fprintf(f,"%s",buf);
                        }
                        fclose(f);
			exit(0);
		}
		close(c_sock);
	}

	
}

/* 
*/