Salve,
mi sto esercitando con l'uso dei socket.Ho scritto un semplice programma client/server.Di seguito il codice:


SERVER
codice:
#include <stdio.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <string.h>
#include <signal.h>
#include <errno.h>
#include <sys/wait.h>
#define PORT 50003
#define FILE_TRASF "/home/and/src1/c/alarm.c"
void sigchld_hand(int);
int main(){
	struct sockaddr_in serv_addr;
	int list_fd,conn_fd;
	socklen_t len;
	pid_t pid;

	if( signal(SIGCHLD,sigchld_hand) == SIG_ERR){
		perror("signal() error");
		exit(1);
	}

	if( (list_fd=socket(AF_INET,SOCK_STREAM,0)) < 0){
		perror("socket() error");
		exit(1);
	}
	memset((void*)&serv_addr,0,sizeof(serv_addr));
	serv_addr.sin_family=AF_INET;
	serv_addr.sin_port=htons(PORT);
	serv_addr.sin_addr.s_addr=htonl(INADDR_ANY);
	len=sizeof(serv_addr);

	if( bind(list_fd,(struct sockaddr*)&serv_addr,sizeof(serv_addr)) < 0){
		perror("bind() error");
		exit(1);
	}

	if( listen(list_fd,80) < 0){
		perror("listen() error");
		exit(1);
	}

	while(1){
		if( ((conn_fd=accept(list_fd,0,0)) < 0)){
			perror("accept() error");
			exit(1);
		}
		printf("conn_fd=%d\n",conn_fd);
		pid=fork();
		if( pid < 0){
			perror("fork() error");
			exit(1);
		}
		else{
			if( pid == 0){
				int fd;
				ssize_t nwritten;
				char buf[1024];
				FILE *file_trasf;
				fd=dup(conn_fd);
				//sleep(10);
				memset((void*)buf,'\0',1024);
				printf("PROCESSO FIGLIO  %d conn_fd=%d\n",getpid(),fd);
				close(conn_fd);
				if( (file_trasf=fopen(FILE_TRASF,"r")) == NULL){
					perror("fopen() error");
					exit(1);
				}
				while((fgets(buf,1024,file_trasf)) != NULL){
					len=strlen(buf);
					if((nwritten=write(fd,buf,len)) != len){
						perror("write() error");
						exit(1);
					}
				}
				//close(fd);
				exit(0);
			}
		}
	}
}

void sigchld_hand(int signo){
	int pid;
	int err=errno;
	while((pid=waitpid(WAIT_ANY,NULL,WNOHANG)) > 0)
		;
	
	errno=err;
}
CLIENT
codice:
#include <stdio.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <string.h>

#define FILE_TRASF "/home/and/src1/c/fileC1/alarm.c"

#define PORT 50003
int main(int argc,char*argv[]){
	int sock_fd;
	FILE* fd;
	ssize_t nread;
	struct sockaddr_in serv_addr;
	char buf[1024];
	memset((void*)buf,'\0',1024);

	if((sock_fd=socket(AF_INET,SOCK_STREAM,0)) < 0){
		perror("socket() error");
		exit(1);
	}

	memset((void*)&serv_addr,0,sizeof(serv_addr));
	serv_addr.sin_family=AF_INET;
	serv_addr.sin_port=htons(PORT);
	if( inet_pton(AF_INET,argv[1],&serv_addr.sin_addr) <= 0){
		perror("inet_pton() error");
		return -1;
	}

	if( connect(sock_fd,(struct sockaddr*)&serv_addr,sizeof(serv_addr)) < 0){
		perror("connect error");
		exit(1);
	}
	if( (fd=fopen(FILE_TRASF,"w")) == NULL){
		perror("open() error");
		exit(1);
	}
	
	while( (nread=read(sock_fd,buf,1024)) > 0){
		printf("%s",buf);
		//buf[nread]='\0';
		if(  fputs(buf,fd) == EOF ){
			if( feof(fd) > 0 ){
				perror("fputs() error");
				break;
			}
		}
	}
	fclose(fd);
	close(sock_fd);


	printf("esco\n");
}
Il problema consiste che il client si blocca in fputs.Cosa sbaglio.Grazie per l'aiuto.