免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 10586 | 回复: 11
打印 上一主题 下一主题

请教:关于C语言读取HTTP响应数据包内容的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-04-09 17:29 |只看该作者 |倒序浏览
今天在写代码的时候遇到一个问题,就是我发送完HTTP请求后,对方发送给我HTTP响应,我想把响应的内容(不包括HTTP头部)保存到文件中,读取HTTP响应的代码如下所示:
  1.         while((nbytes=read(sockfd,buffer,1))==1)
  2.         {
  3.                 if(i < 4)
  4.                 {
  5.                         if(buffer[0]=='\r' || buffer[0]=='\n')
  6.                         {
  7.                                 i++;
  8.                         }
  9.                         else
  10.                         {
  11.                                 i = 0;
  12.                         }
  13.                         printf("%c", buffer[0]);/*把http头信息打印在屏幕上*/
  14.                 }
  15.                 else
  16.                 {
  17.                         fwrite(buffer, 1, 1, fp);/*将http主体信息写入文件*/
  18.                         i++;
  19.                         if(i%1024 == 0)
  20.                         {
  21.                                 fflush(fp);/*每1K时存盘一次*/
  22.                         }
  23.                 }
  24.         }
复制代码
但是,现在遇到来问题:读取完后,程序无法退出循环,导致无法结束程序,如下图所示:

光标一直在哪里闪烁,怎么才能让该循环结束呢??求解。。。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
2 [报告]
发表于 2012-04-09 17:32 |只看该作者
回复 1# 梦醒潇湘love


   
这个。。。。。。
缺少了无数条件判断

你还是看看APACHE的代码吧

论坛徽章:
0
3 [报告]
发表于 2012-04-09 17:53 |只看该作者
缺少无数条件判断?我不晓得哪里缺少了,请您指教。另外,我会看看APACHE的代码的,谢谢~~~回复 2# safedead


   

论坛徽章:
0
4 [报告]
发表于 2012-04-09 21:59 |只看该作者
while(read) 会一直阻塞在那里吧?如果对方不关闭socket,read调用就会阻塞当前进程。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
5 [报告]
发表于 2012-04-10 09:42 |只看该作者
楼主要做的第一件事,就是熟读RFC2616,特别是HTTP响应数据结构

首先你收到的是HTTP/1.1响应,里面有个keep-alive,这意味着在keep-alive时限内服务器不会主动关闭连接
所以你得判定是否有keep-alive,有和没有处理方法不同

其次你得判定Content-Type
然后查找Content-Length是否出现
还要查找Transfer-Encoding是否出现
3者的排列组合决定了你何时认为收到完整的HTTP实体


还有很多很多

就楼主的目的来说,想完整的接收200 HTTP/1.1所包含的实体,至少要分析如下HTTP头域:
Connection
Content-Type
Content-Length
Transfer-Encoding
这是最起码的分析,然后综合判定HTTP实体是否完整接收

至于完整的实现HTTP客户端,还要看很多RFC
还好楼主没打算编浏览器,完整的HTTP客户端实现只占浏览器的不到5%的内容

论坛徽章:
0
6 [报告]
发表于 2012-04-10 10:42 |只看该作者
回复 5# safedead 恩阿,您说的对,确实考虑的不够全面,我再考虑考虑。。。请问有什么关于HTTP协议的开源的东西么?最后是c语言的。。谢谢您。。


   

论坛徽章:
0
7 [报告]
发表于 2012-04-10 10:48 |只看该作者
回复 4# yph007595

是不是因为我构造的HTTP请求中Connection:keep-alive的原因阿??
   

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
8 [报告]
发表于 2012-04-10 11:02 |只看该作者
梦醒潇湘love 发表于 2012-04-10 10:42
回复 5# safedead 恩阿,您说的对,确实考虑的不够全面,我再考虑考虑。。。请问有什么关于HTTP协议的开源的 ...


先看RFC2616,网上有的是
C语言代码请下载APACHE的代码,有钱的话买本分析APACHE代码的书也不错
没钱的话直接上APACHE网站拖代码自己看

论坛徽章:
0
9 [报告]
发表于 2012-04-10 11:39 |只看该作者
问题原因应该是:我发送的HTTP请求中:Connection:Keep-alive。read()一直阻塞,但是,最后过好长时间也会关闭,我想应该是服务器设置了Keep-alive:300,当然,有可能不是300,是其他的什么值,所以,服务器自动关闭连接的时候,read()读到EOF然后退出循环,才使程序结束。。。当我把Connection改为:Closed时,问题就 基本  解决了。
我不知道这种解释对不对??/

论坛徽章:
0
10 [报告]
发表于 2012-04-10 11:40 |只看该作者
回复 8# safedead
好的,谢谢,学习中。。。


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP