Salve,
mi sto esercitando con l'uso dei socket.Ho scritto un semplice programma client/server.Di seguito il codice:
SERVER
CLIENTcodice:#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; }
Il problema consiste che il client si blocca in fputs.Cosa sbaglio.Grazie per l'aiuto.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"); }

Rispondi quotando