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在该小二进制字符串之后).
我只需要摆脱标题部分,有一个简单的方法来做到这一点?
你最好使用像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
(不确定是否存在)或类似功能.
我认为您需要提取值Content-Length
以了解要读取的二进制数据的大小,否则将无法知道是否已收到所有数据.消耗(主要是忽略)标题部分的一种简单方法是逐字节地读取输入数据,直到"\r\n\r\n"
遇到,这表示标题部分的结束和内容的开始.