2

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

这是用 C 写的。

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

4

3 回答 3

5

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

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

于 2013-02-17T21:13:32.850 回答
0

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

于 2013-02-17T22:49:15.287 回答
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
}

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

无论如何,谢谢你们,最终以一种非常低效的方式来获得我的答案,但必须做的事情已经完成。

于 2013-02-18T01:01:44.953 回答