linux 用http 下载文件,linux c http下载文件

#include #include #include #include #include #include #include #include #include #include void print_error(const char *msg) { perror(msg); exit(1); } int download(const char *host,const char *filepath,const char *newfilename) { int sfd = socket(AF_INET,SOCK_STREAM,0); if (sfd == -1) print_error("socket"); struct hostent *phost = gethostbyname(host); if (phost == NULL) print_error("gethostbyname"); struct sockaddr_in serv_addr; serv_addr.sin_family = AF_INET; //默认80端口 serv_addr.sin_port = htons(80); //根据域名获取到ip地址 serv_addr.sin_addr.s_addr = ((struct in_addr *)phost->h_addr)->s_addr; //连接服务器 int ret; restart: ret = connect(sfd,(struct sockaddr *)&serv_addr,sizeof(serv_addr)); if (ret == -1) { if (errno == EINTR) { goto restart; } print_error("connect"); } char http_temp[BUFSIZ]; bzero(http_temp,sizeof(http_temp)); sprintf(http_temp,"GET %s HTTP/1.1\r\n",filepath); write(sfd,http_temp,strlen(http_temp)); sprintf(http_temp,"Host: %s\r\n",host); write(sfd,http_temp,strlen(http_temp)); sprintf(http_temp,"%s","Connection: Keep-Alive\r\n"); write(sfd,http_temp,strlen(http_temp)); write(sfd,"\r\n",strlen("\r\n")); shutdown(sfd,SHUT_WR); FILE *fp = fdopen(sfd,"rb"); if (fp == NULL) print_error("fdopen"); #define MAXSIZE 1024 char buffer[MAXSIZE]; bzero(buffer,sizeof(buffer)); char *psize = NULL; unsigned long filesize; while(fgets(buffer,MAXSIZE - 1,fp)) { //printf("%s\n",buffer); if (strlen(buffer) == 2) break; else { psize = strstr(buffer,"Content-Length:"); if (psize != NULL) { psize = strchr(psize,':'); if (psize != NULL) { psize++; filesize = strtoul(psize,NULL,10); } } } bzero(buffer,sizeof(buffer)); } printf("get file size is %lu bytes\n",filesize); printf("are you sure to download this file?\n"); printf("please enter anykey to continue\n"); getchar(); FILE *newfp = fopen(newfilename,"wb+"); if (newfp == NULL) print_error("fopen"); unsigned int size,sum = 0; while(1) { size = fread(buffer,1,sizeof(buffer),fp); sum += size; if (size == 0) break; printf("downlod %u bytes\n",sum); if (!(size = fwrite(buffer,1,size,newfp))) { printf("fwrite error\n"); break; } } close(sfd); fclose(fp); fclose(newfp); return 0; } int main(int argc,const char *argv[]) { if (argc < 4) { printf("Usage: download host filepath newfilename\n"); printf("for example\n"); printf("download ftp.gnu.org /gnu/bc/bc-1.03.tar.gz bc-1.03.tar.gz\n"); return 1; } return download(argv[1],argv[2],argv[3]); }

测试通过请放心使用~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值