【问题标题】:Remove HTTP Header Info删除 HTTP 标头信息
【发布时间】:2012-08-20 14:17:32
【问题描述】:

在 C 中,当在套接字上使用 recv() 时,有没有办法排除数据附带的 HTTP 标头信息?我正在尝试读取一些二进制数据,而我想要的只是实际的二进制信息,而不是 HTTP 标头信息。当前接收到的数据如下所示:

HTTP/1.1 200 OK
Content-Length: 3314
Content-Type: image/jpeg
Last-Modified: Tue, 20 Mar 2012 14:51:34 GMT
Accept-Ranges: bytes
ETag: "45da99f1a86cd1:6b9"
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
Date: Mon, 20 Aug 2012 14:10:08 GMT
Connection: close 

╪ α

我只想读取文件的二进制部分。 (这显然不是所有的二进制文件,只显示了这么多,因为我将 recv 循环的输出打印为字符串,而第一个 NULL 字符在那个小二进制字符串之后)。

我只需要去掉标题部分,有没有简单的方法可以做到这一点?

【问题讨论】:

  • 我不认为有,但我知道在 C++ 中有。可能有一些库可以在 C 中提供帮助。但是您不需要知道 Content-Length 属性以便为有效负载分配足够的空间吗?

标签: c http sockets header


【解决方案1】:

您最好使用一些 HTTP 解析库,例如 curl

如果你想自己做:

你可以搜索'\r\n\r\n'(两个\r\n)分隔HTTP头和内容,然后使用字符串/缓冲区。

另外,您需要从标头中获取Content-Length 并读取那么多字节作为http 内容。

类似:

/* http_resp has data read from recv */
httpbody = strstr(http_resp, "\r\n\r\n");
if(httpbody) 
    httpbody += 4; /* move ahead 4 chars
/* now httpbody  has just data, stripped down http headers */

注意:请确保strstr 不会溢出内存,可能正在使用strnstr(不确定是否存在)或类似功能。

【讨论】:

    【解决方案2】:

    我认为您需要提取Content-Length 的值才能知道要读取的二进制数据的大小,否则将无法知道是否已收到所有数据。一个简单的消费和忽略头部部分的方法是逐字节读取传入的数据,直到遇到"\r\n\r\n",这表示头部部分的结束和内容的开始。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-28
      • 1970-01-01
      • 2011-07-19
      • 2014-01-27
      • 1970-01-01
      • 2011-05-26
      • 2018-04-24
      • 1970-01-01
      相关资源
      最近更新 更多