2015-01-08 234 views
2

我嘗試從遠程網絡服務器下載tar文件,但我只獲取虛假數據。每次運行時其他bytesize並用HTTP標頭:ANSI C從服務器下載文件

//now it is time to receive the page 
    memset(buf, 0, sizeof(buf)); 
    FILE *fp; 

    if ((fp = fopen(FILENAME, "wb"))==NULL) { 
     perror("Error open file"); 
    } 
    else { 
     while((tmpres = recv(xmlsock, buf, 65536, 0)) > 0){ 
      fwrite(buf, sizeof(buf), 1, fp); 
      memset(buf, 0, tmpres); 
     } 
    } 
    if(tmpres < 0) { 
     perror("Error receiving data"); 
    } 

    fclose(fp); 
    close(xmlsock); 

我送頭是:

GET /updates/xxxxx.tar HTTP/1.1 
Host: www.yyyyyyyy.de 
User-Agent: HTMLGET 1.1 
Connection: close 

任何人可以幫助我嗎?

回答

1

嘗試:

fwrite(buf, 1, tmpres, fp); 

你總是寫在你的原始代碼sizeof(buf)字節,但你只讀tmpres字節,所以你每次都寫了很多的克魯夫特(難保有多大數據包是您收到的數據包以及多少recv調用您的數據將被拆分)

+0

謝謝!這是我的問題。我知道了! – user2372814

0

兩個問題:第一個問題是您將完整的緩衝區寫入文件,即使並非全部都由recv調用填充。另一個問題是,你收到的一切,而不考慮HyperText Transfer Protocol自然包括頭。

對於第一個問題,解決方案非常簡單,因爲您已經有一個變量,其值是接收到的數據量。

對於第二個問題,您需要了解HTTP以及它如何分隔標題和數據。