2014-10-27 45 views
-1

當我嘗試通過HTTP協議使用流套接字下載一組文件時,它僅從我嘗試下載的第一個文件獲取數據。
假設像下面這樣的循環......無法下載多個帶有套接字的文件C

char* file = (char*) malloc(enough_space); 
char page[] = {"www.foobar.com"}; 
for(int n=0 ; n<10 ; n++) 
    { 
     sprintf(file, "file%i.html", n); 
     fopen(file, "wb"); 
     sprintf(request, "GET %s HTTP/1.1\nHost: %s\n\n", file, page); 
     write(socket, request, strlen(request)); 
     read_file(output_file); 
     fclose(output_file); 
    } 

當一個連接已經建立了第一個。
這段代碼會給我file1.html,包括服務器的頭文件。但是隻有第一個文件,這使我困惑。爲了得到它們,我需要做些什麼?
非常感謝。

+0

你循環從0開始,所以第一個文件應該是file0.html而不是file1.html。我認爲還有更多的事情要做。 – Nostromoo 2014-10-27 21:21:06

+0

對於給定一個連接的多個請求,HTTP不允許這樣做。你想嘗試http://en.wikipedia.org/wiki/HTTP_persistent_connection - 但總的來說,我建議使用諸如libcurl之類的第三方庫來處理所有錯綜複雜的HTTP,包括SSL,重定向,編碼和內容類型。 – deets 2014-10-27 21:23:34

回答

1

HTTP的設計使得只有一個文件可以通過TCP連接下載。要通過一個TCP連接下載多個文件,可以使用HTTP流水線技術。你可以在這裏閱讀更多:HTTP pipelining request text example

或者您也可以使用許多庫會處理這個問題,和HTTP等諸多注意事項你的一個:libcurl中,libsoup ...

+0

非常感謝,一次發送所有請求解決了我的問題:) – 2014-10-27 22:10:56

+1

HTTP流水線不是答案。並非所有服務器都支持流水線。處理HTTP響應並保持正確的答案是答案。服務器可以在任何/每個文件後關閉套接字。在發送下一個請求之前,您必須分析每個響應,確定服務器是否關閉套接字,並根據需要重新連接。流水線處理需要適當的保持活動處理。流水線的目的是通過使用更少的TCP數據包發送多個請求來提高網絡性能。流水線不提供下載管理,您需要適當的HTTP處理。 – 2014-10-28 04:04:42

相關問題