在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 char在该小二进制字符串之后)。
我只需要摆脱标题部分,有没有一种简单的方法可以做到这一点?
答案 0 :(得分:6)
您最好使用一些HTTP解析库,如curl
如果你想自己做:
您可以搜索分隔HTTP标头和内容的'\r\n\r\n'
(两个\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
(不确定是否存在)或类似功能。
答案 1 :(得分:6)
我认为您需要提取Content-Length
的值以了解要读取的二进制数据的大小,否则将无法知道是否已收到所有数据。消耗(通常忽略)标题部分的一种简单方法是逐字节地读取输入数据,直到遇到"\r\n\r\n"
,这表示标题部分的结束和内容的开头。