服务器返回HTTP标头和二进制文件;像这样:如何知道HTTP头部分何时结束?
HTTP/1.1 200 OK
Date: Thu, 28 Jun 2012 22:11:14 GMT
Server: Apache/2.2.3 (Red Hat)
Set-Cookie: JSESSIONID=blabla; Path=/
Pragma: no-cache
Cache-Control: must-revalidate, no-store
Expires: Thu, 01 Jan 1970 00:00:00 GMT
Content-disposition: inline; filename="foo.pdf"
Content-Length: 6231119
Connection: close
Content-Type: application/pdf
%PDF-1.6
%âãÏÓ
5989 0 obj
<</Linearized 1/L 6231119/O 5992/E 371504/N 1498/T 6111290/H [ 55176 6052]>>
endobj
xref
5989 2744
0000000016 00000 n
0000061228 00000 n
0000061378 00000 n
我想只复制二进制文件。但是如何知道标题部分何时结束?我试过检查一下这行是否包含\r\n\r\n
,但看起来这个标准不适用于服务器响应,只适用于客户端。这给出:
Content-disposition: inline; filename="foo.pdf"
Content-Length: 6231119
Connection: close
Content-Type: application/pdf
%PDF-1.6
%âãÏÓ
5989 0 obj
<</Linearized 1/L 6231119/O 5992/E 371504/N 1498/T 6111290/H [ 55176 6052]>>
endobj
xref
5989 2744
0000000016 00000 n
这里是C代码:
while((readed = recv(sock, buffer, 128, 0)) > 0) {
if(isnheader == 0 && strstr(buffer, "\r\n\r\n") != NULL)
isnheader = 1;
if(isnheader)
fwrite(buffer, 1, readed, fp);
}
UPDATE:
我把continue
控制了我的if语句:
if(isnheader == 0 && strstr(buffer, "\r\n\r\n") != NULL) {
isnheader = 1;
continue;
}
好,它按预期工作。但正如@Alnitak所提到的那样,这并不安全。
非常感谢您的回答。我试过了,但我保存了0个字节。 :( – Jack
@Jack我刚刚完成的测试在测试程序的例子,我做了一些调整,适当转移缓冲数据,转而使用read()和指数(),并更新了代码既要工作“ \ r \ n'和'\ n'行结束符 –
非常感谢。 – Jack