如何在C中从HTTP头中提取数据?

如何在C中从HTTP头中提取数据?,c,http-headers,winsock,C,Http Headers,Winsock,今天我要问的是如何从C(不是C++)中的recv()中接收到的缓冲区中提取数据段。 我只是需要一些建议,我该怎么做 HTTP/1.1 200正常\r\n 日期:2005年5月23日星期一22:38:34 GMT\r\n 服务器:Apache/1.3.3.7(Unix)(Red Hat/Linux)\r\n 上次修改:周三,2003年1月8日23:11:55 GMT\r\n ETag:“3f80f-1b6-3e1cb03b”\r\n 内容类型:text/html;字符集=UTF-8\r\n 内容

今天我要问的是如何从C(不是C++)中的
recv()
中接收到的缓冲区中提取数据段。

我只是需要一些建议,我该怎么做

HTTP/1.1 200正常\r\n
日期:2005年5月23日星期一22:38:34 GMT\r\n
服务器:Apache/1.3.3.7(Unix)(Red Hat/Linux)\r\n
上次修改:周三,2003年1月8日23:11:55 GMT\r\n
ETag:“3f80f-1b6-3e1cb03b”\r\n
内容类型:text/html;字符集=UTF-8\r\n
内容长度:131\r\n
连接:关闭\r\n
\r\n
示例页
你好,世界,这是一个非常简单的HTML文档。

上面标题的那部分?它存储在我的缓冲区中,我只想解析数据(页面的源代码)。有什么想法吗?

标题以
\r\n\r\n
结尾。如果整个响应都在接收缓冲区中,并且您在响应末尾放置了一个
'\0'
,那么您可以使用以下代码查找数据段的开头

char *data = strstr( buffer, "\r\n\r\n" );
if ( data != NULL )
{ 
    data += 4;
    // do something with the data
}

您需要实际解析数据,以便知道报头和消息数据的结束位置,以及消息数据的结束位置。标题以
\r\n\r\n
CRLF
+
CRLF
0x0D 0x0A 0x0D 0x0A
)字节序列结尾。所以你必须一直阅读直到你遇到终结者。然后,您必须解析消息头,以了解消息的其余部分是如何编码的,以及消息是如何终止的。有关规则,请参阅。这将告诉您如何读取剩余数据,以及何时停止读取。数据可能被分块、压缩或自终止。
内容类型
传输编码
标题告诉您如何解释消息数据

在您的特定示例中,在读取标题后,根据第4.4节,您将检索
内容长度
标题的值,然后精确读取131个字节,停止读取,并关闭套接字,因为
连接:关闭
标题。然后检索
内容类型
头的值,知道数据是UTF-8编码的HTML,并相应地进行处理

请参阅我在前面的回答中发布的伪代码:


要回答的问题很多。所以你只想去掉标题?如果我是你,我会反省数据,并尝试推断任务的最佳策略。找到
并放弃之前的所有内容?也许最简单的方法是找到双精度\r\n,但您必须知道数据可能被分块或压缩,因此无法跳过对响应头的分析。