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

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

这是用C写的。

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

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

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

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

最后我做了这样的事情:

 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 } 

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

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