【发布时间】:2015-05-06 04:54:55
【问题描述】:
我正在用 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);
}
当我在一次文件传输后对服务器进行读取时,程序挂起。
【问题讨论】:
-
欢迎来到 StackOverflow。服务器知道的唯一方法是客户端将消息发送回服务器。如果您的服务器在尝试读取该消息时挂起,那么您没有正确编码读取。请显示您的实际代码,或 MCVE 演示问题。
-
服务器会在读取中挂起,因为它是一个阻塞调用,并且会一直等到它收到一些东西。
-
是的,但我正在让客户端将消息“准备好”写入套接字;服务器无法读取。
-
你试过在 write() 之后关闭客户端的套接字吗?