免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1815 | 回复: 0
打印 上一主题 下一主题

菜鸟问题 ~ ,使用socket进行HTTP下载 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-07-30 19:59 |只看该作者 |倒序浏览
写了段代码,使用SOCKET进行HTTP下载,主要是HTTP头的格式化和处理。问题:接收文件不完整。代码如下,抱歉,没有优化,只是框架。

char HTTPhdr[] = "GET %s HTTP/1.1\r\n"
                 "Accept: */*\r\n"
                 "Host:%s\r\n"
                 "Connection: Keep-Alive\r\n\r\n";


int HTTPdl(char *addr)
{
  int sockfd, i = 0;
  FILE *fd;
  char buf[1024*2];

  struct  addrinfo hints, *res;

  sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

  bzero(&hints, sizeof(hints));
  hints.ai_flags = AI_CANONNAME;
  hints.ai_family = AF_INET;

  int geta;

  geta = getaddrinfo(node(addr, "node"), "80", &hints, &res);
    if(geta)
      fprintf(stderr, "getaddrinfo error\n");

  int cont;

  cont = connect(sockfd, res->ai_addr, res->ai_addrlen);
    if(cont)
      fprintf(stderr, "connect error!\n");

    bzero(buf, 1024*2);

    sprintf(buf, HTTPhdr, node(addr, "filename"), node(addr, "node"));  //node(),格式化地址,第二参数,filename输出文件名,node输出host;

    int writex;

    writex = write(sockfd, buf, strlen(buf));
    if(writex <= 0)
      fprintf(stderr, "send error!\n");

    bzero(buf, 1024*2);

    i = read(sockfd, buf, strlen("HTTP/1.1 200 OK")+2);
    fprintf(stdout, "%s", buf);

    int num = 0;

    if(!strncmp("200 OK", buf+9, strlen("200 OK"))){
      char *fname = strrchr(node(addr, "filename"), '/');
      fd = fopen(fname+1, "wb");
      if(!fd)
        fprintf(stderr, "fd error!\n");

      bzero(buf, 1024*2);

      i = read(sockfd, buf, 1024*2);
      
      int Lenght = filesize(buf);  //filesize(),根据Content-Length字段输出文件大小;

      char *tmp = NULL;

      tmp = strstr(buf, "\r\n\r\n");

      i = fwrite(tmp+4, sizeof(char), strlen(tmp+4), fd);  //拆分HTTP头和数据;
  
      *(tmp+4) = '\0';

    fprintf(stdout, "%s", buf);

    Lenght = Lenght - i;  //以后做下载进度用;

    while(1){
      bzero(buf, 1024*2);
      i =  read(sockfd, buf, 1024*2);
      if(i <=0)
        break;

      fwrite(buf, sizeof(char), i, fd);
      num += i;  
    }

   }
  
   if(i <0)
    fprintf(stderr, "recv error!\n");

   fprintf(stdout, "file size %d\n", num);

    close(sockfd);
    fclose(fd);

    return 0;
}

简陋 + 丑陋 + 菜鸟,各位包含~
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP