【问题标题】:How to extract data from HTTP header in C?如何从 C 中的 HTTP 标头中提取数据?
【发布时间】:2023-03-13 21:30:01
【问题描述】:

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

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

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>

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

【问题讨论】:

  • 要回答的问题很多。
  • 所以你只是想剥离标题?如果我是你,我会反省数据并尝试推断任务的最佳策略。
  • 找到&lt;html&gt;并丢弃之前的一切?
  • 也许最简单的方法是找到双\r\n,但你必须注意数据可能被分块或压缩压缩,所以不能跳过解析响应头。

标签: c http-headers winsock


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    查看我在之前的答案中发布的伪代码:

    Receiving Chunked HTTP Data With Winsock

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-29
      • 1970-01-01
      • 2016-03-04
      • 2020-06-13
      • 1970-01-01
      • 2021-02-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多