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

时间:2015-05-27 02:12:32

标签: c http-headers winsock

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

我只需要一些建议,我将如何获得

HTTP/1.1 200 OK\r\n
Date: Mon, 23 May 2005 22:38:34 GMT\r\n
Server: Apache/1.3.3.7 (Unix) (Red-Hat/Linux)\r\n
Last-Modified: Wed, 08 Jan 2003 23:11:55 GMT\r\n
ETag: "3f80f-1b6-3e1cb03b"\r\n
Content-Type: text/html; charset=UTF-8\r\n
Content-Length: 131\r\n
Connection: close\r\n
\r\n

<html>
<head>
<title>An Example Page</title>
</head>
<body>
  Hello World, this is a very simple HTML document.
</body>
</html>

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

您需要实际解析数据,以便知道标头的结束位置和消息数据的开始位置,以及消息数据的结束位置。标头以\r\n\r\nCRLF + CRLF0x0D 0x0A 0x0D 0x0A)字节序列结尾。所以你必须继续阅读,直到你遇到终结者。然后,您必须解析标题以了解消息的其余部分是如何编码以及它是如何终止的。有关规则,请参阅RFC 2616 Section 4.4 Message Length。这将告诉您如何读取剩余数据, WHEN 停止阅读。数据可能被分块或压缩或自终止。 Content-TypeTransfer-Encoding标题会告诉您如何解释邮件数据。

在您的特定示例中,在阅读标题后,根据第4.4节,您将检索Content-Length标头的值,然后读取正好131个字节,停止读取并关闭套接字,因为{{1}标头然后,您将检索Connection: close标头的值,并知道数据是UTF-8编码的HTML并相应地处理它。

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

Receiving Chunked HTTP Data With Winsock