用\ r \ n \ r \ n检测http头的结尾

时间:2013-02-17 21:07:29

标签: c http

使用recv我想获取http标头,以便我可以解析内容长度。但是我在检测换行时遇到了问题。或者实际上我甚至必须检测换行符,或者我第一次读入缓冲区时总是是完整的标题(假设我有足够长的缓冲区)。

这是用C语言写的。

编辑:查看一些相关问题我担心的一件事是 “...标题中断的”\ r \ n“可能会被两个不同的recv()调用拉入缓冲区,这会阻止您的代码识别标题中断。”

3 个答案:

答案 0 :(得分:4)

你应该反复调用recv(),每次它给你x个字节,你就会增加x字节给你的缓冲区指针(并减少cb,它也允许写入)按x字节)。执行此操作直到缓冲区包含\r\n\r\n或完全填满,在这种情况下,您只需关闭套接字并从此忽略恶意客户端。缓冲区大小应该是大约3000字节。

但是:这忽略了服务器似乎是轮询服务器的一般问题。如果你有一些经验,你应该尝试制作一个epoll服务器。

答案 1 :(得分:0)

除了在数据包边界上识别“\ r \ n \ r \ n”的问题之外,还存在跨数据包边界识别“Content-Length:xxxx \ r \ n”的问题。我建议一次接收和解析一个字节。当你得到'\ r'的recv()后跟'\ n'的recv(),然后是'\ _'的recv()后跟'\ n'的recv()时,你可以得到确定标题已结束。一旦你掌握了这一点,修改你的解决方案,以便在n是最初定义为1的预处理器定义的时候接收并解析n个字节,并更改n。

答案 2 :(得分:0)

最后我做了这样的事情:

while ( recv... > 0 ) {
     if rnrn is inside the buffer using strstr
         look for content length, output error if content length doesn't exist
     else
         keep on reading into the buffer
}

然后一旦找到标题,我就继续阅读邮件正文。

无论如何,谢谢你们,最后做了一个非常低效的方式来得到答案,但必须做的就是完成。