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
Post a Comment