2015-01-08 195 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以及它如何分隔标题和数据。