7

recv()在 C 中,有没有办法在套接字上使用时排除数据附带的 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 字符在那个小二进制字符串之后,所以只显示了那么多)。

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

4

2 回答 2

9

你最好使用一些 HTTP 解析库,比如curl

如果你想自己做:

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

此外,您需要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(不确定是否存在)或类似的功能。

于 2012-08-20T14:26:00.363 回答
8

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

于 2012-08-20T14:26:16.347 回答