嵌入式linux如何下载程序,Linux平台的下载程序-嵌入式系统-与非网

2023-11-18

有许多网络文件下载工具可以在Windows平台下很好地工作,如NetAnts、“网际快车”、TelePro等,还有像WebZip那样功能强大的离线浏览器。这些工具使我们可以在Windows环境下很轻松地下载网站上的文件、目录、网站的一部分,甚至整个网站。然而在Linux环境下,这类工具却很少。笔者通过自己的摸索,在集成开发环境KDevelop 1.2下实现了一个网站下载程序,它支持文件级的“多线程下载”和“断点续传”。下面本文分3部分介绍实现这一程序的基本技术。

基本原理

1.超级链接寻径算法

要想灵活地下载一个网站的全部或部分内容,程序就必需具备从用户指定的URL开始,沿着它所包含的超级链接遍历整个网站的能力。在这个基础上根据用户的限制,筛选出所要下载的文件。

从“图论”的角度分析,网站其实是一个由文件和超级链接组成的“连通有向图”。文件是图中的顶点,超级链接是有向边。我们需要对这个有向图进行“广度优先遍历”。为此,需要用一个队列URLQueue来存放待访问的目标。初始情况下,队列中只含有用户指定的那个URL。程序从队头取得下载目标的URL,如果它符合用户的限制,就下载它指向的文件。分析此文件,找出其中包括的超级链接,生成新的下载目标的URL,然后将它们插入到队列尾部。重复以上过程,直到队列中没有符合用户限制的URL为止。

由于网站是一个“连通有向图”,所以沿着超级链接,很可能回到已经访问过的文件。为了避免程序出现死循环,要登记已经访问过的目标。在分析下载文件的超级链接时,我们要将生成的新目标的URL与已经访问过的进行比较,剔除会造成重复访问的URL。为了提高查询速度,我们采用了“哈希表”来存放从队头取出的URL。“哈希函数”可以采用将URL中的字符作为整型值相加,然后模一个质数的简单方法来实现。在本文介绍的程序中使用了质数103。

2.多线程下载和断点续传

多线程下载和断点续传使用了同一个技术。HTTP协议允许客户端在向服务器端发送下载一个文件的GET请求时,使用“Range: bytes=a1-a2"选项,要求服务器只传送指定文件中从第a1个字节到a2个字节之间的部分内容。因此下载一个文件时,可以将其分成若干段,然后启动多个线程,同时与服务器建立链接,分别传送一个文件的多个部分。最后在本地将其拼接成一个完整的文件。由于从网上下载文件时,瓶颈是在服务器端和网络传输过程中,所以采用多线程同时下载将大大提高下载速度。

当文件传输因出现问题而中断时,程序可以将各个线程当前下载的进度和已经下载的内容当做“断点信息”保存到文件中。用户下一次下载同一目标时,程序可以根据文件中保留的断点信息下载上次未完成的部分,然后将整个文件拼接起来,完成下载工作。这种技术对于在经常“掉线”的情况下下载大文件非常有利。因此,在当前流行的下载软件中都采用了此项技术。

Linux如何启动线程

1.定义一个以void *为参数、返回void *的函数。例如,为了启动下载线程,需要定义如下函数:

void * start(void * arg)

{

((CWebCopy *) arg)->DownLoad();

return arg;

}

2.在需要启动线程时,只要三条语句。例如,启动下载线程的代码如下:

#include

pthread_t tid;

pthread_create(&tid,NULL,start,arg);

部分程序的实现

以下是下载线程中三个关键性函数的算法描述(假定这三个函数都被封装在CwebCopy类中)。

int CWebCopy::DownLoad(char * host,char *path,int a1,int a2,BYTE * buf)

{

//本函数从host所指定的HTTP服务器上下载路径为path的文件中从第a1字节到第a2字节的内容,与host所指定的主机的80端口(HTTP端口)建立流式链接,共尝试5次

bool connected = false;

int sock; //用于存放套接字描述符

for(i = 0; i 

if((sock = Connect(host,80)) 

sleep(1);

else{

connected = true;

break;

}

}

if(connected){

//向指定的HTTP服务器发送GET请求,下载当前指定路径下的文件的一部分

Send(sock,“GET path%cHost: %s%cRange: bytes=%d-%d%c”,path,10,host,10,a1,a2,10);

int inflen,index = 0;

while(1){

struct timeval tv;

tv.tv_sec = 1;

tv.tv_usec = 0;

//检查套接字是否接收到了数据,尝试20次,每次间隔1秒

int readen;

readen =ReadEn(sock,tv,20);

//如果套接字中20秒内仍然没有数据,则认为超时

if(readen 

//接收数据,并存放在信息缓冲区中

inflen=read(sock,(buf+index),a2-a1); // 如果此文件所需部分已经下载结束

if(inflen <= 0) break;

}

return 0;

}

else return -1;

}

int CWebCopy ::Send(int sock,char *fmt,...)

{

//本函数将指定的字符串发送到sock所指向的远程HTTP服务器

char BUF[1024];

va_list argptr;

//处理可变个数参数

va_start(argptr,fmt);

//将参数整理成字符串后放入BUF中

vsprintf(BUF,fmt,argptr);

va_end(argptr);

//将BUF中的字符串发送到sock所指向的远程服务器

return send(sock ,BUF,strlen(BUF),0);

}

int CWebCopy ::ReadEn(int sock,struct timeval tv,int tryloop)

{

//利用select函数检验套接字sock,如果套接字接收到数据则返回“读使能”,如果出现“内部中断”以外的错误,则返回 “读禁止”

fd_set rfdset;

FD_ZERO(&rfdset);

FD_SET(sock,&rfdset);

int readen = 0;

for(int i = 0; i 

readen = select(m_sock+1,&rfdset,NULL,NULL,&tv);

if(readen>0||(readen

break;

sleep(1);

}

return readen;

}

分享到:

来源:互联网

版权声明:本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

嵌入式linux如何下载程序,Linux平台的下载程序-嵌入式系统-与非网 的相关文章

  • 静态分析分析

    软件静态分析概念 静态分析通常是指不执行程序代码而寻找代码中可能存在的错误或评估程序代码的过程 被测对象是各种不软件相关的有必要测试的产物 如文档 源代码等 通过扫描程序正文对程序的数据流和控制流等进行分析 找出系统的缺陷 得出测试报告 不
  • 网络安全实验室CTF练习部分题目(持续更新)

    1 脚本关 微笑一下 过关地址 http lab1 xseclab com base13 ead1b12e47ec7cc5390303831b779d47 index php 查看源代码 include flag php smile 1 i
  • webpack 5 模块联邦实现微前端疑难问题解决

    webpack 5 模块联邦实现微前端疑难问题解决 说明 webpack 5 新增 Module Federation 模块联邦 功能 他可以帮助将多个独立的构建组成一个应用程序 不同的构建可以独立的开发与部署 借助模块联邦我们可以一定程度
  • 什么是思维导图?6 个开源免费的思维导图软件

    目录 15款思维导图工具推荐 什么是思维导图 6 个开源免费的思维导图软件 当前推荐 Freeplane 离线应用 有免安装版本 跨平台 目前 2023年 还在更新中 下载 https sourceforge net projects fr
  • 【CentOS7】-bash: ifconfig: 未找到命令

    安装完CentOS7并配置完网络之后 使用ifconfig命令进行测试出现以下情况 原因分析 缺少ifconfig组件 那么我们可以下载相关的网络组件来解决 yum install y net tools 一波未平 一波又起 出现了一下问题
  • 李飞飞深度学习与计算机视觉——KNN(KNearestNeighbor)

    之前为了熟悉机器学习的东西去搞kaggle的东西 然后就从Titanic入门咯 结果发现并没有对机器学习的东西有深入的理解 做数据挖掘的时候直接调用sklearn里面的框架 根本不用去想机器学习的公式的运用和基础的实现 想用SVM就直接fr
  • Object.defineProperty

    Object defineProperty Object defineProperty obj prop descriptor obj 要在其上定义属性的对象 prop 要定义或修改的属性的名称 descriptor 将被定义或修改的属性描
  • 登录界面测试用例设计

    登录界面测试用例设计 一 界面测试点 1 界面的设计风格是否与UI的设计风格统一 2 界面中的文字简洁易懂 3 界面中没有错别字 二 用户名与密码在输入时 要考虑 1 正确的用户名与正确的密码 2 正确的用户名与错误的密码 3 错误的用户名
  • 腾讯云前端面经

    腾讯云招聘一共四面 第一面是你以后的同事面试 主要考察基础知识 第二面是以后的直属领导 会考察基础原理 以及和职位的匹配度 三面是主管 考察项目等整体 四面为hr面试 一面 一面都比较基础 涉及js vue和网络安全 1 自我介绍 单纯的自
  • 如何使用Go Module代理

    简介 在我们使用Go Module时 golang org x中的文件因为撞墙无法下载 通过改变GOPROXY环境变量可以指定下载源 地址 https mirrors aliyun com goproxy 阿里云的代理仓 https gop
  • QT 帮助文档 使用方法

    我们使用 Qt 帮助文档 主要分为这么几步 1 类使用的相关介绍 2 查看所用部件 类 的相应成员函数 功能 参数 返回值 3 查看部件的信号 4 查看部件的事件 所对应的虚函数如何编写 1 类使用的相关介绍 光标移动到类名字的地方 接着按
  • python 爬虫调用 js 的库之 execjs

    python 爬虫调用 js 的库之 execjs 针对现在大部分的网站都是使用 js 加密 js 加载的 并不能直接抓取出来 这时候就不得不使用一些三方类库来执行 js 语句 1 安装 pip install PyExecJS 2 运行环
  • 你是否看到过如此有趣的AI网站?

    1 营销文案 CopyAI Create Marketing Copy In Seconds 2 美化ppt设计 https www beautiful ai 3 图片修改 https hotpot ai 4 照片变视频 https www
  • shell 多行注释详解

    在我们写 shell 脚本的时候 特别在调试的时候经常需要注释多行命令 但在每一行前输入 显得有些麻烦 基于 shell 命令的灵活性 我们可以使用下面的方法 方法一 这是比较稳妥的作法 可以采用 HERE DOCUMENT 特性 实现多行
  • android应用程序版本管理

    一 版本的主要功能说明 在应用程序的升级 维护策略中 版本是一个关键的组成部分 主要体现在以下几个方面中 1 用户需要了解在他们的设备上所安装的应用程序的版本的特定信息 以及已安装程序的升级版本可用的情况 2 其他应用程序 作为同一个套件中
  • AD20铺铜显示和隐藏的设置

    如果只想隐藏当前选中的铜皮 那么就选中对应需要隐藏的铜 然后鼠标右击 在弹出的对话框中选择 铺铜操作 隐藏选中铺铜 需要隐藏一部分铜皮 即打开铺铜管理器 选择菜单栏中 工具 铺铜 铺铜管理器 在弹出的铺铜管理器对话框中 想将哪些铜皮去进行隐
  • 招行卡中心服务端开发【已offer】

    流程 4 2投递简历 4 9笔试 4 15一面 4 22二面 4 28offer 笔试 卡中心笔试题量偏少 16道选择 两道编程 选择题范围很广 涉及了java c 设计模式 概率统计 信息论与编码 数据库 操作系统 计网等等等等知识点 编
  • C/C++ &与&&

    表示逻辑与的意思 即为and 当运算符两边的表达式的结果都为true时 整个运算结果才为true 否则 只要有一方为false 则结果为false 比如 12 23的结果就是1 12 1 的结果是1 123 0的结果就是0 还具有短路的功能
  • Gdb 调试核心已转存储-调试VINS-FUSION/ORB-SLAM

    GDB调试C 工程非ROS 1 通过运行可执行程序来进入gdb CMakeLists中的修改 SET CMAKE BUILD TYPE Debug SET CMAKE CXX FLAGS DEBUG ENV CXXFLAGS O0 Wall

随机推荐

  • 2023-05-29 Unity 2进制5——Excel配置表工具

    文章目录 一 Excel 读取操作 一 打开 Excel 表 二 获取单元格信息 二 Excel 表配置工具 一 基础知识 二 配置工具 三 演示步骤 1 ExcelTool 2 BinaryMgr 一 Excel 读取操作 一 打开 Ex
  • 推荐系统(3)——最经典的推荐算法(协同过滤算法原理部分)

    一 最经典的推荐算法 协同过滤推荐算法 Collaborative Filtering 算法思想 物以类聚 人以群分 基本的协同过滤推荐算法基于以下假设 跟你喜好相似的人喜欢的东西你也很有可能喜欢 基于用户的协同过滤推荐 User base
  • 思科模拟器:三层交换实现不同vlan间的通信(图文)

    我们实现不同vlan间通信不止有这一种办法 比如我们常用的单臂路由可以实现不同vlan间通信 我以前的博客也有发布 不会的可以关注一下以前的文章 但是他经常应用于中小企业他的缺陷有 1 单臂 为网络骨干链路 容易形成网络瓶颈 2 子接口依然
  • python 包、模块学习总结

    模块基础 1 基本概念 模块是最高级别的程序组织单元 它将程序代码和数据封装起来以便重用 从实际角度来看 模块往往对应于python程序文件 或是用外部语言如C Java或C 编写而成的扩展 每一个文件都是一个模块 并且模块导入其他模块之后
  • gitlab安装并汉化

    gitlab安装并汉化 准备工作 Gitlab安装包分2种gitlab ce gitlab ee gitlab为社区免费版本 gitlab ee为企业收费版本 在功能上没有太大的区别 应没有使用过与安装过 网也没有资料 只是在网查询到一篇文
  • git上传仓库内容超过100M解决方法git

    git上传仓库内容超过100M解决办法git 报错例如 原因是上传文件最大只能上传100M 所以这里要把太大的文件删除 然后重新提交git 操作步骤如下 1 先找到文件的具体路径 执行方法上述报错中有 参考 git rev list obj
  • vscode c++解决包含头文件红色波浪线问题

    安装c c 插件后 按ctrl shift p 点击打开了c cpp properties json文件 对其中的IncludePath进行编辑 示例如下 includePath workspaceFolder workspaceFolde
  • CAP理论

    CAP理论在互联网界有着广泛的知名度 知识稍微宽泛一点的工程师都会把其作为衡量系统设计的准则 大家都非常清楚地理解了CAP 任何分布式系统在可用性 一致性 分区容错性方面 不能兼得 最多只能得其二 因此 任何分布式系统的设计只是在三者中的不
  • 靶机练习 No.23 Vulnhub靶机DarkHole 2 .git信息泄露 .bash_history历史命令提权

    靶机练习 No 23 Vulnhub靶机DarkHole 2 0x00 环境准备 0x01 信息收集 步骤一 ip 探测 步骤二 端口扫描 0x02 漏洞挖掘 思路一 web漏洞挖掘 git信息收集 思路二 22ssh 爆破 步骤一 git
  • CentOS7 运维 - 系统基础优化大全

    CentOS7 运维 系统基础优化大全 一 更换Yum源 国内源地址 备份CentOS官方源 使用阿里yum源 使用本地yum源 使用清华yum源 推荐 二 防火墙 临时关闭防火墙 永久关闭防火墙 关闭SELinux 临时关闭 永久关闭 三
  • Linux下SVN操作常用命令

    1 检出 svn co http 路径 目录或文件的全路径 本地目录全路径 username 用户名 password 密码 svn co svn 路径 目录或文件的全路径 本地目录全路径 username 用户名 password 密码
  • FLUKE DSX-5000 CH线缆测试仪怎么升级到新国标

    FLUKE DSX 5000 CH线缆测试仪怎么升级新标准GB T50312 2016 下面山东朗坤小编带给您FLUKE DSX 5000 CH线缆测试仪升级带有新标准软件的整体步骤 一起来学习吧 升级到5 1之后必须使用Linkware9
  • 全网最全总结,有源码,期望、有效值、方差、相关系数、自相关函、互相关函数,还分不清吗

    原文来自公众号 工程师看海 1 期望 期望也就是平均值 是一个数值 反应的是随机变量平均取值的情况 期望也叫做加权平均 在信号中代表直流分量 当随机变量X满足均匀分布时 对一段长度为N的离散序列X x n n 0 1 2 N 1 其期望E
  • 深度学习-1.1卷积

    卷积是一种数学运算 教科书上一般定义 首先有两个函数函数 f g 然后这两个函数的卷积 f g 如下 连续形式 离散形式 1 先将函数g t 延y轴翻转为g t 这是 卷 的由来 2 其中n是卷积的参数 将g t 平移n个长度 变为g n
  • Lua调用C的动态库步骤及接口分析

    Lua调用C的动态库 C语言可以完成一些lua不好实现的功能 当程序主体使用lua完成时 便需要掌握该技巧调用C来帮助我们达到目的 通过调用C的动态库简化操作流程 大致流程如下 使用C语言编写方法提供给lua调用 将C文件打包成动态库 lu
  • excel中怎样将数据合并到一个单元格用逗号隔开

    打开需要操作的Excel表格 将数据合并在一个单元格 并用逗号隔开 如图所示 excel中怎样将数据合并到一个单元格用逗号隔开 选中B1单元格 并输入分隔符号逗号 excel中怎样将数据合并到一个单元格用逗号隔开 单击B1单元格 向下拖动B
  • 使用 ChatGPT 辅助学习——为自己找一个老师

    我们每个人都有许多标签 例如高中生 成绩中等 文科 根据这些标签我和其他拥有相同标签的人分配了相同的教程 班级和老师 这可以带来效率上的提升 因为同一份教程 老师就可以服务几十上百人 而无须为每个人定制 但也正是这样造成了忽略个性的问题 而
  • STM32F103野火之中断

    顾名思义STM32中中断分为内核中断和外部中断 内核中断称为 异常 外部中断称为 中断 IPR寄存器STM只使用了高四位低四位没有使用所以共有2 4种情况 EXTI的功能框图分为两个部分 红色轨迹 模式为中断控制 有中断控制寄存器位决定 绿
  • Hyperledger Fabric 示例启动流程(二)

    test network启动流程 1 启动测试网络 此命令创建一个由两个对等节点和一个排序节点组成的Fabric网络 network sh up createOrgs 使用cryptogen工具或者Fabric CA来创建Org1 Org2
  • 嵌入式linux如何下载程序,Linux平台的下载程序-嵌入式系统-与非网

    有许多网络文件下载工具可以在Windows平台下很好地工作 如NetAnts 网际快车 TelePro等 还有像WebZip那样功能强大的离线浏览器 这些工具使我们可以在Windows环境下很轻松地下载网站上的文件 目录 网站的一部分 甚至