PDA

Visualizza la versione completa : [C] blocco all'interno della funzione fputs


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


SERVER


#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


#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.

and77
13-11-2010, 18:06
Basta aggiungere nel server(processo padre) la chiusura di conn_fd.Quindi



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

Loading