我正在用 c 编写一个客户端 - 服务器程序,我必须在其中将多个图像文件从服务器发送到客户端。服务器有什么办法可以知道客户端何时完成了从套接字的读取,在本地创建了图像文件并成功写入了吗?PS 我已经尝试向套接字发送消息,当我尝试从服务器读取套接字时,程序挂起。任何帮助都感激不尽。这是服务器代码中的一个函数,它将文件发送到套接字:
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
Run Code Online (Sandbox Code Playgroud)
这是客户端写入文件的函数:
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);
}
Run Code Online (Sandbox Code Playgroud)
当我在一次文件传输后在服务器上进行读取时,程序挂起。
您的问题在客户端:
while(( num = recv(sockfd,buf,256,0))>0)
Run Code Online (Sandbox Code Playgroud)
recv()只会0在文件结束时返回——即当服务器关闭套接字的发送端时。但是您的服务器并没有这样做 - 它正在等待来自客户端的响应。这意味着你陷入僵局。
如果你想在一个连接中发送多张图片,你需要向你的客户端发送一些信息,让它知道一张图片何时结束。一种方法是首先向您的客户端发送它应该期望的文件大小,然后是文件数据。然后客户端可以跟踪它收到了多少字节,并在此之后发送“就绪”响应。