Chinaunix

标题: recv 读取http头部的问题 [打印本页]

作者: goingstudy    时间: 2012-10-30 20:20
标题: recv 读取http头部的问题
本帖最后由 goingstudy 于 2012-10-30 20:41 编辑

现在我是发一个http请求,然后通过识别\r\n\r\n读取http的头部,读取头部时是通过read(sockfd,buf,1)来读取,但是通过调试发现读不进去,这是怎么回事,有遇到过这种问题的吗?
作者: linux_c_py_php    时间: 2012-10-30 20:22
read(sockfd,buf,1), 这是读1字节?????????
作者: goingstudy    时间: 2012-10-30 20:32
本帖最后由 goingstudy 于 2012-10-30 20:34 编辑

回复 2# linux_c_py_php


    对啊,因为我想获得http响应报文的长度,但是又不想先发head请求,我是发一次请求,然后一个字节一个字节的读取头部后,在正常的读取body
作者: goingstudy    时间: 2012-10-30 20:34
上面打错了,应该是read(sockfd,&buf,1);
作者: goingstudy    时间: 2012-10-30 21:39
结贴,知道怎么回事了,发请求时弄错了
作者: justmao945    时间: 2012-10-30 22:06
一直没太搞清楚假如read到一个buffer后,求教怎么得到完整的一个http请求~要做个状态机么?
作者: hanzhenlll    时间: 2012-10-31 08:29
回复 3# goingstudy


    为什么要这么做,http协议中有地方专门标注了长度单元,而且你请求的时候可以不请求实体数据..
作者: goingstudy    时间: 2012-10-31 10:11
本帖最后由 goingstudy 于 2012-10-31 10:12 编辑

回复 6# justmao945
因为http的头部的长度不确定,所以一个字符一个字符的读取到一个缓冲区里,直到\r\n\r\n,从接受到头部的缓冲区里取出http的长度,再读取http的body,这样不行吗?我是初学的
另:如果先发HEAD请求得到http的头部,在发GET请求,要发两次请求,感觉不如上面快

   
作者: goingstudy    时间: 2012-10-31 10:14
回复 7# hanzhenlll


    我是想只读取http响应的body,但是又不想发两次请求,所以这样做了,感觉挺蹩脚的,还有什么好的的方法吗,求指教
作者: fenghw8088    时间: 2012-10-31 11:18
应该一次性读尽可能多的数据到一个大些的缓冲区(如4KB),然后遍历缓冲区中的字节,发现\r\n则可以提取1行数据。
回复 1# goingstudy


   
作者: snailshen    时间: 2012-10-31 11:22
楼上的方法比lz的方法效率高多了
作者: justmao945    时间: 2012-10-31 14:39
本帖最后由 justmao945 于 2012-10-31 14:39 编辑

回复 8# goingstudy


    嗯,可以见后面有人的回复,read是系统调用,每次读一字节效率问题很严重的。。。

还有是多个客户端的问题,我认为服务端对应的每个客户端fd要有自己的buffer和状态。
作者: unix_bo    时间: 2012-10-31 15:02
It's better to read into a bigger buffer ,then process, otherwise will cause performance issue.
作者: goingstudy    时间: 2012-10-31 21:50
好的,感谢各位




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2