Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Knowing when Client has finished reading from the socket in C

Tags:

c

sockets

I am writing a client-server program in c where I have to send multiple image files from the server to the client. Is there any way for the server to know when the client has finished reading from socket, creating the image file locally, and successfully written to it? P.S. I already tried sending a message to the socket and when I try to read the socket from the server, the program hangs. Any help will be much appreciated. Here is a function from the Server code which sends the file to socket:

while(1)
{
  unsigned char buf[256] = {0};

  int n = fread(buf,1,256,fp);

  if(n>0) { send(sockfd,buf,n,0); }
  if(n<256) {
    if(feof(fp)) 
       printf("Sent to socket\n");
       break;
    }
  }
  fclose(fp);
}

char buf[5]
read(sockfd,buf,5);
if(strcmp(buf,"ready")==0) //send more files  

And here is a function from the client to write to the file:

 FILE* fp;
 fp = fopen(file_path,"ab");
 char buf[256];
 int num;
 int total=0;
 while(( num = recv(sockfd,buf,256,0))>0)
 {
  total+=num;
  fwrite(buf,1,num,fp);
 }

 fclose(fp);

 write(sockfd,"ready",5);

 }

When I do a read on the server after one file transfer, the program hangs.

like image 282
porctree2803 Avatar asked Mar 17 '23 04:03

porctree2803


1 Answers

You problem is here in the client:

while(( num = recv(sockfd,buf,256,0))>0)

recv() will only return 0 at end-of-file - ie when the server shuts down the sending side of the socket. However your server isn't doing that - it's waiting for a response from the client. This means you deadlock.

If you want to send multiple images in the one connection, you need to send your client some information to allow it to tell when one image ends. One way to do this is to first send your client the size of the file it should expect, then the file data. The client can then keep track of how many bytes it's recieved, and send the "ready" reponse after that.

like image 142
caf Avatar answered Mar 25 '23 09:03

caf