使用recv我想获取http标头,以便我可以解析内容长度。但是我在检测换行时遇到了问题。或者实际上我甚至必须检测换行符,或者我第一次读入缓冲区时总是是完整的标题(假设我有足够长的缓冲区)。
这是用C语言写的。
编辑:查看一些相关问题我担心的一件事是 “...标题中断的”\ r \ n“可能会被两个不同的recv()调用拉入缓冲区,这会阻止您的代码识别标题中断。”
答案 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
}
然后一旦找到标题,我就继续阅读邮件正文。
无论如何,谢谢你们,最后做了一个非常低效的方式来得到答案,但必须做的就是完成。