服務器返回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