Linux下使用http协议下载文件
#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协议下载文件的更多相关文章
- linux下怎么样上传下载文件夹
Linux下目录复制:本机->远程服务器 scp -r /home/shaoxiaohu/test1 zhidao@192.168.0.1:/home/test2 test1为源目录,test2 ...
- 基于Linux下Iptables限制BT下载的研究
基于Linux下Iptables限制BT下载的研究 摘要: 当前BT下载技术和软件飞速发展,给人们网上冲浪获取资源带来了极大的便利, 但同时BT占用大量的网络带宽等资源也给网络和网络管理员 ...
- 11、只允许在主目录下上传和下载文件,不允许用putty登录
创建用户xiao, 使其只允许在用户主目录 (/var/www/html)下上传和下载文件,不允许用putty登录 (为了安全起见,不给过多的权限) 1.创建xiao用户 [root@localh ...
- linux 从百度网盘下载文件的方法
linux 从百度网盘下载文件的方法 发表于2015 年 月 日由shenwang 方法1.wget wget是在Linux下开发的开放源代码的软件,作者是Hrvoje Niksic,后来被移植到包括 ...
- Linux下的文件结构,及对应文件夹的作用
Linux下的文件结构,及对应文件夹的作用 /bin 二进制可执行命令 /dev 设备特殊文件 /etc 系统管理和配置文件 /etc/rc.d 启动的配置文件和脚本 /home 用户主目录的基点,比 ...
- linux使用命令上传下载文件 -- lrzsz
之前都是用Xftp工具在本地和linux系统之间上传下载文件,最近觉得麻烦,因为平时用Xshell连接,要传输文件的时候还要额外使用别的工具,下面是lrzsz的安装和简单的使用过程: 详细的使用可以s ...
- ubuntu Linux 测试PHP却提示下载文件的解决办法
ubuntu Linux 测试PHP却提示下载文件的解决办法 一般这种情况都是在刚刚开始配置环境时出现的, 输入 sudo a2enmod php5 看提示如果出现“$ This module ...
- linux 下C语言编程库文件处理与Makefile编写
做开发快3年了,在linux下编译安装软件算是家常便饭了.就拿gcc来说,都有不下10次了,可基本每次都会碰到些奇奇怪怪的问题.看来还是像vs.codeblocks这样的ide把人弄蠢了.便下定决心一 ...
- Linux下用rm删除的文件的恢复方法
Linux下用rm删除的文件的恢复方法_Linux教程_Linux公社-Linux系统门户网站https://www.linuxidc.com/Linux/2008-08/14744.htm linu ...
随机推荐
- mysql 在visual studio中的配置
视图-->其他窗口-->服务器资源管理器-->数据连接-->右键添加连接 servername:localhost username:root password:123456 ...
- Spring Security 登录校验 源码解析
传统情况下,在过滤器中做权限验证,Spring Secuirty也是在Filter中进行权限验证. 创建并注册过滤器 package com.awizdata.edubank.config; impo ...
- Qt: 执行cmd命令;
QProcess p(NULL); p.setWorkingDirectory(szAppPath+"/database"); //指定工作路径,这个地方一定要设置: p.star ...
- 野路子码农系列(2)Python中的类,可能是最通俗的解说
啥叫佩奇?啥叫类?啥叫面向对象?后面两个问题以前在大学里“祖传谭浩强”的时候我经常会有所疑问.老师说着一堆什么public, private,我都是一脸懵逼,啥叫私有?为啥要私有?然后就神游天外了…… ...
- linux expect 即exp脚本交互功能【原】
场景 expect命令用于任何自动化互动的过程. send – 发送字符串到进程 expect – 等待来自进程的特定的字符串 spawn – 启动命令 安装 expect一开始100%不存在, 手动 ...
- MongoDB分组查询,聚合查询,以及复杂查询
准备数据 from pymongo import MongoClient import datetime client=MongoClient('mongodb://localhost:27017') ...
- 一个Ajax读数据并使用IScroll显示辅助类
花了2天时间对iscroll进行了一些封装,方便进行ajax读取数据和显示 1.IScroll直接使用的话还是挺麻烦的,特别是牵涉到分页加载动态加载数据时,以下是核心实现代码. 2.Loading提示 ...
- jemter测试中常见的名词解析
1.响应时间(RT) 响应时间是指系统对请求做出响应的时间 2.吞吐量(TPS)[Throughput] 吞吐量是指系统在单位时间内处理请求的数量 3.并发用户数 并发用户数是指系统可以同时承载的正常 ...
- 递归处理vue菜单数据
结构不多说,bean的封装很简单,直接上核心代码吧,自己根据需要把不要的属性自己过滤掉: public List<MenuBo> getMenuByUserId(Long user_id, ...
- python3 练手实例6 做一个简单日历
import calendar year = int(input('请输入要查询的年份:')) month = int (input('请输入要查询的月数:')) print (calendar.mo ...