即使套接字为空,C recv()仍继续读取

即使套接字为空,C recv()仍继续读取,c,sockets,C,Sockets,新的套接字编程。我在做一个HTTP服务器。在持久连接中,我在服务器从客户端发送第一个HTTP请求的第一个文件(1MB文本文件)后保持套接字打开。之后,服务器和客户端程序就处于空闲状态。我搜索了很多,发现recv()一直在套接字上查找数据,直到服务器端的套接字连接关闭 如果存在持久连接,我应该怎么做? 我正在客户端读取一个文件(文件包含许多行。每行上只有一个文件名,通过持久连接从服务器获取) 发送所请求文件的服务器代码的一部分: while((bytesread = fread(fileconte

新的套接字编程。我在做一个HTTP服务器。在持久连接中,我在服务器从客户端发送第一个HTTP请求的第一个文件(1MB文本文件)后保持套接字打开。之后,服务器和客户端程序就处于空闲状态。我搜索了很多,发现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);
}
while((bytesread=fread(filecontent,sizeof(char),1024,fp))>0)
{
printf(“字节读取:%d文件内容:%s\n”,字节读取,文件内容);
if((n=send(*newsockfd,filecontent,1024,0))0)
{printf(“\n在while中用于读取文件的n字节%d\n”,n);
printf(“响应:\n%s”,缓冲区);
}

否则(n您的客户机-服务器协议不足。服务器发送输入文件的所有字节(以及更多字节,因为您硬编码了
1024
,而不是使用
bytesread
)。但客户机应如何理解文件何时完成

一个简单的解决方案是让服务器以文件大小开始每次传输。您只需发送一个
uint64\u t
(而不是
int
,因为它在所有平台上都必须是固定大小)。该数字将表示要遵循的总字节数(即文件大小)。您可以使用
fseek
以常规方式获取文件大小(
SEEK\u END
then
ftell
或类似方式)

然后,一旦您的客户机接收到指定数量的字节,它就可以跳出循环

即使套接字为空,仍继续读取

“套接字为空”没有意义。它是打开的或关闭的。在这种情况下,它仍处于打开状态,因此您的代码将继续读取。它将仅在对等方关闭连接时停止

如果你要实现HTTP,你需要很好的工作知识,尤其是与内容长度相关的部分。你的代码目前还没有开始解决这个问题,而且这个主题太难在这里讨论。如果说keepalive和读取套接字到流的末尾是相互不一致的,那就说明这一点

注意:如果您在读取除
EAGAIN/ewoldblock
以外的套接字时出错,您应该退出循环,并且还应该打印真正的错误,而不是您自己设计的消息

注意(2)不需要将缓冲区归零


注意(3)打印缓冲区的正确方法是
printf(“%s”,n,buffer)
,但只有当
n>0

您在
recv
之前在代码的客户端部分调用了
connect
。首先,您需要
发送
bytesread
字节,而不是硬代码
1024
。至于您的问题,是您不知道何时“挂断”的问题吗停止接收数据,或者…?我不喜欢这个地方
如果((n=send(*newsockfd,filecontent,1024,0))yes在recv之前调用connect。yes将发送bytesread。yes不知道何时停止接收数据。我读了recv()一直在寻找套接字上的数据。因此,即使在服务器发送了所有1MB文本之后,客户端recv()也一直在寻找套接字上的数据。呃,实际上我在发送bytesread。然后在玩硬编码值。这两个都不起作用……是的,我明白你的意思,发送文件大小……谢谢!
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;
}