c - 知道客户端何时完成从 C 中的套接字读取

标签 c sockets

我正在用 c 编写一个客户端-服务器程序,我必须将多个图像文件从服务器发送到客户端。有没有办法让服务器知道客户端何时完成从套接字读取、在本地创建图像文件并成功写入?附言我已经尝试向套接字发送消息,当我尝试从服务器读取套接字时,程序挂起。任何帮助都感激不尽。 这是服务器代码中的一个函数,它将文件发送到套接字:

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  

这是客户端写入文件的函数:

 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);

 }

当我在一个文件传输后在服务器上读取时,程序挂起。

最佳答案

你的问题出在客户端:

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

recv() 只会在文件末尾返回 0 - 即当服务器关闭套接字的发送端时。但是您的服务器并没有这样做——它正在等待来自客户端的响应。这意味着你陷入僵局。

如果你想在一个连接中发送多张图片,你需要向你的客户端发送一些信息,让它知道一张图片何时结束。一种方法是首先向您的客户端发送它应该期望的文件大小,然后是文件数据。然后客户端可以跟踪它收到了多少字节,然后发送“就绪”响应。

关于c - 知道客户端何时完成从 C 中的套接字读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30067822/

相关文章:

java - 我们需要在我们的 UML 类图中添加接口(interface) Runnable 吗?

c++ - Winsock MSG_DONTWAIT 等效项

c - 未初始化变量的默认值

gcc预处理后能输出C代码吗?

c++ - UDP Tx 循环每次在正好 3970 个数据包时停止工作,在我 friend 的计算机上为 14386

java - 当我尝试使用套接字在计算机之间传输时,文件到达为空

c++ - GMainLoop 和 TCP Listen 线程阻塞

c - 来自 recvfrom() 和 AF_PACKET/PF_PACKET 的套接字地址类型

C 中图的连通分量

c - 如何使用 %d 在 printf 中保留 2 位数字