套接字编程的新手。我正在制作一个HTTP服务器。在持久连接中,在服务器为客户端发送的第一个HTTP请求的第一个文件(1 MB文本文件)后,我将套接字保持打开状态。之后,服务器和客户端程序将处于空闲状态。我进行了很多搜索,发现recv()一直在套接字上寻找数据,直到套接字连接从服务器端关闭为止。
如果持续存在连接该怎么办?
我正在客户端读取文件(文件包含多行。每行上只有一个文件名,该文件名将通过持久连接从服务器获取)
发送请求文件的服务器代码的一部分:
while((bytesread = fread(filecontent,sizeof(char), 1024, fp))>0)
{
printf("Bytes Read:%d File Content:%s\n",bytesread,filecontent);
if((n = send(*newsockfd, filecontent, 1024,0))<0)
{
error("SERVER Error: Failed to Write File to Socket");
break;
}
bzero(filecontent,1024);
}
客户端代码中我读取服务器发送的文件的部分:
for(;;)
{
n=recv(socketfd, buffer, 1024,0);
printf("%d\n",n);
if(n>0)
{ printf("\n in while for reading the file for n bytes %d \n",n);
printf("Response:\n%s",buffer);
}
else if(n<0)
{
disperror("Error reading from socket");
}
if(n==0)
break;
}
花了很多时间。无法获取该怎么办...
最佳答案
您的客户端-服务器协议不足。服务器发送输入文件的所有字节(以及更多,因为您硬编码了1024
而不是使用bytesread
)。但是客户应该如何理解文件何时完成?
一种简单的解决方案是让服务器以文件大小开始每次传输。您可以简单地发送一个uint64_t
(而不是int
,因为它在所有平台上都必须是固定大小)。该数字将表示要跟随的总字节数(即文件大小)。您可以使用fseek
以通常的方式(SEEK_END
然后ftell
或类似方法)获取文件大小。
然后,一旦您的客户端收到指定数量的字节,它就可以退出循环。
关于c - 即使套接字为空,C recv()仍继续读取,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32804293/