Visualizzazione dei risultati da 1 a 2 su 2
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2007
    Messaggi
    136

    [C] blocco all'interno della funzione fputs

    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.

  2. #2
    Utente di HTML.it
    Registrato dal
    Dec 2007
    Messaggi
    136

    [RISOLTO]

    Basta aggiungere nel server(processo padre) la chiusura di conn_fd.Quindi

    codice:
    if( pid == 0){
                 perror("fork() error");
                 exit(1);
    else{
                 if( pid > 0){
                                //codice processo figlio
                 }
                  else{
                                close(conn_fd);
                  }
    }

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.