#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <netdb.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <sys/socket.h> //下载目标文件 : http://ftp.gnu.org/gnu/bc/bc-1.03.tar.gz
#define HOST_ADDR "ftp.gnu.org"
#define FILE_PATH "/gnu/bc/bc-1.03.tar.gz"
#define FILE_NAME "bc-1.03.tar.gz" void write_to_socket(int socketfd, const char* str)
{
write(socketfd, str, strlen(str));
} int main(void)
{
char* pstr = NULL;
int sk_fd = ;
int size = ;
int sum = ;
unsigned long filesize = ;
FILE* fp = NULL;
FILE* newfp = NULL;
struct sockaddr_in sk_addr;
struct hostent *phost = NULL;
char buf[] = {};
float processbar = 0.0f; // create TCP socket
sk_fd = socket(AF_INET, SOCK_STREAM, );
if (sk_fd < )
{
perror("socket failed");
exit();
} phost = gethostbyname(HOST_ADDR); memset(&sk_addr, 0x00, sizeof(sk_addr));
sk_addr.sin_family = AF_INET;
sk_addr.sin_port = htons();
sk_addr.sin_addr.s_addr = ((struct in_addr *)phost->h_addr)->s_addr;
if (connect(sk_fd, (struct sockaddr *)&sk_addr, sizeof(sk_addr)) < )
{
perror("connect failed");
close(sk_fd);
exit();
} write_to_socket(sk_fd, "GET "FILE_PATH" HTTP/1.1\r\n");
write_to_socket(sk_fd, "Accept: */*\r\n");
write_to_socket(sk_fd, "Host: "HOST_ADDR"\r\n");
write_to_socket(sk_fd, "Connection: Keep-Alive\r\n");
write_to_socket(sk_fd, "\r\n");
shutdown(sk_fd, SHUT_WR); fp = fdopen(sk_fd, "r");
newfp = fopen(FILE_NAME, "w+");
memset(buf, 0x00, sizeof(buf));
while (fgets(buf, , fp))
{
printf("%s\n", buf); if (filesize != ) /* find CRLF */
{
if ( == strlen(buf))
{
break;
}
}
else /* get file size */
{
pstr = strstr(buf, "Content-Length:");
if (pstr != NULL)
{
pstr = strchr(pstr, ':');
pstr++;
filesize = strtoul(pstr, NULL, );
printf("filesize = %lu\n", filesize);
}
}
memset(buf, 0x00, sizeof(buf));
} while ()
{
size = fread(buf, , , fp);
sum += size;
if ( == size)
{
break;
}
size = fwrite(buf, , size, newfp);
processbar = (float)sum / (float)filesize;
printf("%6d/%lu[%2.1f]\n", sum, filesize, processbar * );
}
fclose(fp);
fclose(newfp); return ;
}

Linux下使用http协议下载文件的更多相关文章

  1. linux下怎么样上传下载文件夹

    Linux下目录复制:本机->远程服务器 scp -r /home/shaoxiaohu/test1 zhidao@192.168.0.1:/home/test2 test1为源目录,test2 ...

  2. 基于Linux下Iptables限制BT下载的研究

    基于Linux下Iptables限制BT下载的研究   摘要:     当前BT下载技术和软件飞速发展,给人们网上冲浪获取资源带来了极大的便利, 但同时BT占用大量的网络带宽等资源也给网络和网络管理员 ...

  3. 11、只允许在主目录下上传和下载文件,不允许用putty登录

    创建用户xiao,   使其只允许在用户主目录 (/var/www/html)下上传和下载文件,不允许用putty登录 (为了安全起见,不给过多的权限) 1.创建xiao用户 [root@localh ...

  4. linux 从百度网盘下载文件的方法

    linux 从百度网盘下载文件的方法 发表于2015 年 月 日由shenwang 方法1.wget wget是在Linux下开发的开放源代码的软件,作者是Hrvoje Niksic,后来被移植到包括 ...

  5. Linux下的文件结构,及对应文件夹的作用

    Linux下的文件结构,及对应文件夹的作用 /bin 二进制可执行命令 /dev 设备特殊文件 /etc 系统管理和配置文件 /etc/rc.d 启动的配置文件和脚本 /home 用户主目录的基点,比 ...

  6. linux使用命令上传下载文件 -- lrzsz

    之前都是用Xftp工具在本地和linux系统之间上传下载文件,最近觉得麻烦,因为平时用Xshell连接,要传输文件的时候还要额外使用别的工具,下面是lrzsz的安装和简单的使用过程: 详细的使用可以s ...

  7. ubuntu Linux 测试PHP却提示下载文件的解决办法

    ubuntu Linux 测试PHP却提示下载文件的解决办法   一般这种情况都是在刚刚开始配置环境时出现的, 输入 sudo a2enmod php5  看提示如果出现“$ This module ...

  8. linux 下C语言编程库文件处理与Makefile编写

    做开发快3年了,在linux下编译安装软件算是家常便饭了.就拿gcc来说,都有不下10次了,可基本每次都会碰到些奇奇怪怪的问题.看来还是像vs.codeblocks这样的ide把人弄蠢了.便下定决心一 ...

  9. Linux下用rm删除的文件的恢复方法

    Linux下用rm删除的文件的恢复方法_Linux教程_Linux公社-Linux系统门户网站https://www.linuxidc.com/Linux/2008-08/14744.htm linu ...

随机推荐

  1. Codeforces Round #554 (Div. 2) B. Neko Performs Cat Furrier Transform(思维题+log2求解二进制位数的小技巧)

    传送门 题意: 给出一个数x,有两个操作: ①:x ^= 2k-1; ②:x++; 每次操作都是从①开始,紧接着是② ①②操作循环进行,问经过多少步操作后,x可以变为2p-1的格式? 最多操作40次, ...

  2. 随机逻辑回归random logistic regression-特征筛选

    python信用评分卡(附代码,博主录制) https://study.163.com/course/introduction.htm?courseId=1005214003&utm_camp ...

  3. 联网请求数据:Android篇

    这篇文章主要回顾之前的MYangtzeu App教程的联网请求方法和json解析套路,主要目的是实现左侧菜单数据的联网获取. 1.先上请求地址实体类Constants.java package com ...

  4. unix域数据报回射程序(不完整)

    一.服务器程序 int main(int argc, char **argv) { int sockfd; struct sockaddr_un servaddr, cliaddr; sockfd = ...

  5. Activiti工作流学习笔记

    先从工作流的启动开始讲,Activiti提供了四种工作流的启动方式 1.空启动事件 2.定时启动事件 3.异常启动事件 4.消息启动事件 空启动事件中标签内没有任何其他元素的定义 <startE ...

  6. vue项目中遇到的那些事。

    前言 有好几天没更新文章了.这段实际忙着做了一个vue的项目,从 19 天前开始,到今天刚好 20 天,独立完成. 做vue项目做这个项目一方面能为工作做一些准备,一方面也精进一下技术. 技术栈:vu ...

  7. Python django解决跨域请求的问题

    解决方案 1.安装django-cors-headers pip3 install django-cors-headers 2.配置settings.py文件 INSTALLED_APPS = [ . ...

  8. 内核模块加载错误 “Invalid module format” 解决办法

    参考链接:  http://blog.chinaunix.net/uid-20448327-id-172345.html

  9. 执行docker命令遇到 Get Permission Denied

    安装完docker后,执行docker相关命令,出现: Got permission denied while trying to connect to the Docker daemon socke ...

  10. PyCharm的使用教程

    1.1 安装 首先去下载最新的pycharm ,进行安装.可以直接在官网下载. 1.2 首次使用 1,点击Create New Project. 2, 输入项目名.路径.选择python解释器.如果没 ...