#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. 阿里云ECS服务器部署Node.js项目全过程详解

    本文详细介绍如何部署NodeJS项目到阿里云ECS上,以及本人在部署过程中所遇到的问题.坑点和解决办法,可以说是全网最全最详细的教程了.同时讲解了如何申请阿里云免费SSL证书,以及一台ECS服务器配置 ...

  2. (N叉树 递归) leetcode589. N-ary Tree Preorder Traversal

    Given an n-ary tree, return the preorder traversal of its nodes' values. For example, given a 3-ary  ...

  3. vue的v-model指令

    v-model指令用来绑定表单,数据传值. 如上,当在信息1输入框(表单)中输入值时,数据会对应变化:在信息2输入框中输入值时,数据并未变化. <div id="app"&g ...

  4. freetype 字形解析

    目录 freetype 字形解析 字体管理 数据结构 字体抽象 title: freetype 字形解析 date: 2019/3/7 20:17:46 toc: true --- freetype ...

  5. 20155324《网络对抗》Exp1 PC平台逆向破解(5)M

    20155324<网络对抗>Exp1 PC平台逆向破解(5)M 实验目标 本次实践的对象是一个名为~pwn1~的~linux~可执行文件. 该程序正常执行流程是:~main~调用~foo~ ...

  6. PostgreSql sql shell win10 下乱码解决

    重现步骤: 打开 SQL Shell (psql) Server [localhost]: Database [postgres]: Port ]: Username [postgres]: psql ...

  7. Linux基础 - 系统优化及常用命令

    目录 Linux基础系统优化及常用命令 Linux基础系统优化 网卡配置文件详解 ifup,ifdown命令 ifconfig命令 ifup,ifdown命令 ip命令 用户管理与文件权限篇 创建普通 ...

  8. (一)ORB描述子提取

    ORBSLAM2中使用ORB描述子的方法 经典的视觉SLAM系统大体分为两种:其一是基于特征点法的,其二是基于直接法的.那么本文主要就讲特征点法的SLAM. 基于特征点法的视觉SLAM系统典型的有PT ...

  9. C# - 设计模式 - 模板模式

    模板模式 问题场景 咖啡和茶派生于抽象类饮料,咖啡和茶都具有烧水的方法,所以可以将烧水的方法提取到抽象类饮料中去实现,而咖啡具有一个向杯子加咖啡粉的方法,茶具有一个向杯子加茶叶的方法,看起来两个方法是 ...

  10. jQuery新版本没有了Toggle事件,两个按钮分别控制隐藏显示,同时这两个按钮点击也要互斥。

    十二月没来得及整理发布,一直在草稿箱.现在已经2019年1月了... 需求大概是这样的 //XX点击事件 var flagBar = 0; $("#doNotBaseRate"). ...