2015-09-27 39 views
0

套接字编程的新手段。我正在制作一个HTTP服务器。在持久连接中,服务器发送第一个来自客户端的HTTP请求的第一个文件(1 MB文本文件)后,我保持打开套接字。之后,服务器和客户端程序只是闲置。我搜索了很多,发现recv()一直在查找套接字上的数据,直到套接字连接从服务器端关闭。即使套接字为空,C 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; 
} 

已经花费了大量的时间。无法得到怎么办...

+0

你是否在代码的客户端部分调用'connect'?在'recv'之前。 –

+0

首先,你需要''发送'bytesread'字节,而不是硬编码'1024'。至于你的问题,你不知道什么时候该“挂断”并停止尝试接收数据的问题,或者......? –

+0

,我不喜欢这个地方'if((n = send(* newsockfd,filecontent,1024,0))<0)'。你使用指向套接字'newsockfd'的指针?请在这里放置'newsockfd'变量的声明。 –

回答

0

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

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

然后,一旦你的客户端收到了指定的字节数,就可以跳出循环。

+0

其实我正在发送字节读。然后玩弄硬编码的价值。这两种工作都没有...是的,我明白你在说什么,发送文件大小......谢谢! –

0

继续读,即使插座是空的

'插槽为空' 是没有意义的。它是开放的或封闭的。在这种情况下,它仍然是开放的,所以你的代码不断阅读。它只会在对等关闭连接时停止。

如果您打算实施HTTP,您需要掌握RFC 2616的相关知识,尤其是与内容长度有关的部分。你的代码目前并没有开始解决这个问题,这太容易引起人们的关注。它只是说Keepalive和读取流结束的套接字是不一致的。

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

注意:(2)您不需要清零缓冲区。

注意(3)打印缓冲区的正确方法是printf("%.*s", n, buffer),但只有在n > 0时才适用。

+0

是的,谢谢你.. –

相关问题