删除HTTP标头信息

Kei*_*ler 6 c sockets header http

在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 

? ?
Run Code Online (Sandbox Code Playgroud)

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

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

Roh*_*han 8

你最好使用像curl这样的HTTP解析库

如果你想自己做:

您可以搜索'\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 */
Run Code Online (Sandbox Code Playgroud)

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


hmj*_*mjd 6

我认为您需要提取值Content-Length以了解要读取的二进制数据的大小,否则将无法知道是否已收到所有数据.消耗(主要是忽略)标题部分的一种简单方法是逐字节地读取输入数据,直到"\r\n\r\n"遇到,这表示标题部分的结束和内容的开始.