linux - Second recv call doesn't receive data, halts the execution in C -


this client program requests files server:

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <strings.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <netdb.h>  #define server_port 5959 #define max_line 512  void setstring(char *str){     str[max_line-1]='\0'; }  int main(int argc, char * argv[]){     file *fp;     struct hostent *hp;     struct sockaddr_in sin;     char *host;     char filename[max_line],buf[max_line],reply[max_line],rec_line[max_line];     int s;     char msg[max_line];     int len,new_len,rec_file;     if (argc==2) {         host = argv[1];     }     else {         fprintf(stderr, "usage: simplex-talk host\n");         exit(1);     }      /* translate host name peer's ip address */     hp = gethostbyname(host);     if (!hp) {         fprintf(stderr, "simplex-talk: unknown host: %s\n", host);         exit(1);     }     else         printf("client's remote host: %s\n", argv[1]);      /* build address data structure */       bzero((char *)&sin, sizeof(sin));     sin.sin_family = af_inet;     bcopy(hp->h_addr, (char *)&sin.sin_addr, hp->h_length);     sin.sin_port = htons(server_port);      /* active open */     if ((s = socket(pf_inet, sock_stream, 0)) < 0) {         perror("simplex-talk: socket");         exit(1);     }     else         printf("client created socket.\n");      int send_file_name,rec_msg;     if (connect(s, (struct sockaddr *)&sin, sizeof(sin)) < 0)     {         perror("simplex-talk: connect");         close(s);         exit(1);     }     else{         printf("client connected.\n");         /* main loop: , send lines of text */     printf("hello server\n");     while(!(strcmp(reply,"bye")==0)){             printf("enter file name:\n");             scanf("%s",filename);             setstring(filename);             send_file_name=send(s,filename,strlen(filename)+1,0);             if(send_file_name<0)                 fputs("error sending filename",stdout);             rec_msg=recv(s,msg,sizeof(msg),0);             if(strcmp(msg,"file not found")==0)                 printf("file not found\n");             else{                 printf("%s\n",msg);                 fp=fopen(filename,"w");                 printf("cp1\n");                 if(rec_file=recv(s,rec_line,sizeof(rec_line),0)>0){                     printf("cp2");                     printf("string recieved:%s\n",rec_line);                     if(len=fwrite(rec_line,1,rec_file+1,fp)>0)                         printf("recieved file\n");                     else                         printf("error writing file\n");                 }                 else                     printf("not recieved\n");             }             printf("enter 'bye' terminate requesting files\n");             scanf("%s",reply);         }     }     return 0; } 

this server program accepts request files client:

 #include <stdio.h>  #include <stdlib.h>   #include <string.h>  #include <strings.h>  #include <sys/types.h>  #include <sys/socket.h>  #include <netinet/in.h>  #include <netdb.h>   #define server_port 5959  #define max_pending 5  #define max_line 256   void setstring(char* str){     str[max_line-1]='\0';  }   int main(){     file *fp;     struct sockaddr_in sin;     char buf[max_line],msg[max_line],*rec_line;     int len;     int s, new_s,count;     char str[inet_addrstrlen];     int error_file,send_msg,read_line,send_file;      bzero((char *)&sin, sizeof(sin));     sin.sin_family = af_inet;     sin.sin_addr.s_addr = inet_addr("0.0.0.0");     sin.sin_port = htons(server_port);      /* setup passive open */     if ((s = socket(pf_inet, sock_stream, 0)) < 0) {         perror("simplex-talk: socket");         exit(1);     }      inet_ntop(af_inet, &(sin.sin_addr), str, inet_addrstrlen);     printf("server using address %s , port %d.\n", str, server_port);      if ((bind(s, (struct sockaddr *)&sin, sizeof(sin))) < 0) {         perror("simplex-talk: bind");         exit(1);     }     else         printf("server bind done.\n");      listen(s, max_pending);     /* wait connection, receive , print text */     while(1) {         if ((new_s = accept(s, (struct sockaddr *)&sin, &len)) < 0) {             perror("simplex-talk: accept");             exit(1);         }          printf("server listening.\n");         printf("greetings\n");         int rec_file_name=recv(new_s,buf,sizeof(buf),0);         if(rec_file_name>0)             printf("file requested:%s\n",buf);             fp=fopen(buf,"r");             if(fp==null)             {                 fputs("file not found\n",stdout);                 strcpy(buf,"file not found");                 if(error_file=send(new_s,buf,strlen(buf)+1,0)>0)                     fputs("successfully send error message client\n",stdout);             }             else{                 bzero(buf,max_line);                 printf("file found :) \n");                 strcpy(buf,"ok");                 if(send_msg=send(new_s,buf,strlen(buf)+1,0)>0)                     fputs("file found message sent client\n",stdout);                  fseek(fp,0,seek_end);                 int file_size=ftell(fp);                 fseek(fp,0,seek_set);                 printf("file size:%d\n",file_size);                 rec_line=(char *)malloc(sizeof(char)*(file_size));                 read_line=fread(rec_line,1,file_size+1,fp);                 printf("file read: %s\n",rec_line);                  if(send_file=send(new_s,rec_line,strlen(rec_line)+1,0)>0)                     printf("file string sent client\n");             }         }          close(new_s);        }  

the problem in client, second recv() call, supposed receive contents of file, shows nothing. programs halts @ point, server programs displays has sent file contents. client doesn't receive it.

the basic problem you're not checking return values see how data sent , received. when client calls:

rec_msg=recv(s,msg,sizeof(msg),0); 

it receive sizeof(msg) (512) bytes, both ok message server sending , file contents (after nul). means when second recv call contents, blocks, because read contents in first call , there's no more data waiting in receive buffer.


Comments

Popular posts from this blog

mysql - Dreamhost PyCharm Django Python 3 Launching a Site -

java - Sending SMS with SMSLib and Web Services -

java - How to resolve The method toString() in the type Object is not applicable for the arguments (InputStream) -