2011-01-19 210 views
0

我在寫一個簡單的下載程序。我正在下載jpg圖片。HTTP GET請求問題

void accel::download(int threads){ 
    char msg[] = "HEAD /logos/2011/cezanne11-hp.jpg HTTP/1.0\r\nConnection: close\r\n\r\n"; 
    int back = send(socketC, (const char *)&msg, strlen(msg), 0); 
    char *buff = new char[500]; 
    back = recv(socketC, buff, 500, 0); 

    cout << buff; 

    char *buff2 = new char[700]; 
    char msg2[] = "GET /logos/2011/cezanne11-hp.jpg HTTP/1.0\r\nRange: bytes=0-400\r\nConnection: close\r\n\r\n"; 
    back = send(socketC, (const char *)&msg2, strlen(msg2), 0); 
    back = recv(socketC, buff2, 700, 0); 

    cout << back; 

} 

TCP連接已經初始化,我的代碼的第一部分正在工作。它成功地發送HEAD消息並接收響應。但是當它試圖下載圖片時,recv得到0.什麼可能是錯誤的? 順便說一句,這是學校項目,所以我不允許使用一些花哨的圖書館來執行此操作。這是完整的圖片地址 - http://www.google.com/logos/2011/cezanne11-hp.jpg

回答

4

你,因爲當你指定

你告訴你不想做第二個請求的服務器沒有收到任何連接:關閉

在您的HEAD請求。

這告訴服務器,你只打算髮出一個請求,而不打擾等待一秒鐘。

嘗試將您的第一個請求更改爲持續「保持活動」連接。

「HEAD /logos/2011/cezanne11-hp.jpg HTTP/1.0 \ r \ nConnection:keep-alive \ r \ n \ r \ n」;

注意:如果您不希望服務器消失,則可能需要更改第二個請求以保持活動狀態。

+0

尤里卡:D謝謝:) – gemexas 2011-01-19 21:34:31

0

您是否確認圖像實際上是發送給您的客戶?也許你沒有從服務器得到任何迴應。

嘗試使用wireshark檢查實際的網絡活動。這將讓你看到究竟是什麼被髮送和接收。有可能你沒有從服務器獲取任何東西,或者您的請求存在問題,您可能會發現實際的網絡流量。

+0

我認爲這是事情。發送第二條消息後,我沒有收到任何迴應。但我不知道爲什麼 – gemexas 2011-01-19 21:30:41

1

一般來說,HTTP會關閉套接字。 (HTTP 1.1具有持續(保持活動)連接,儘管您似乎已要求服務器在第一條命令中關閉您的連接。)

因此,請確保您的套接字在首次接收後仍處於打開狀態;我敢打賭,事實並非如此。

0

在您完成了chrisaycock的說明之後,您可能需要將Host:添加到您的請求中。很多共享主機和IP只訪問很可能會開始失敗。