📄 303.htm
字号:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>CTerm非常精华下载</title>
</head>
<body bgcolor="#FFFFFF">
<table border="0" width="100%" cellspacing="0" cellpadding="0" height="577">
<tr><td width="32%" rowspan="3" height="123"><img src="DDl_back.jpg" width="300" height="129" alt="DDl_back.jpg"></td><td width="30%" background="DDl_back2.jpg" height="35"><p align="center"><a href="http://apue.dhs.org"><font face="黑体"><big><big>apue</big></big></font></a></td></tr>
<tr>
<td width="68%" background="DDl_back2.jpg" height="44"><big><big><font face="黑体"><p align="center"> ● UNIX网络编程 (BM: clown) </font></big></big></td></tr>
<tr>
<td width="68%" height="44" bgcolor="#000000"><font face="黑体"><big><big><p align="center"></big></big><a href="http://cterm.163.net"><img src="banner.gif" width="400" height="60" alt="banner.gif"border="0"></a></font></td>
</tr>
<tr><td width="100%" colspan="2" height="100" align="center" valign="top"><br><p align="center">[<a href="index.htm">回到开始</a>][<a href="195.htm">上一层</a>][<a href="304.htm">下一篇</a>]
<hr><p align="left"><small> <br>
Linux平台的下载程序 <br>
http://www.ccw.com.cn 无锡市江南计算机技术研究所 杨剑新 (2001-04-19 15:18:51 <br>
) <br>
有许多网络文件下载工具可以在Windows平台下很好地工作,如NetAnts、“网际快车” <br>
、TelePro等,还有像WebZip那样功能强大的离线浏览器。这些工具使我们可以在Windo <br>
ws环境下很轻松地下载网站上的文件、目录、网站的一部分,甚至整个网站。然而在Li <br>
nux环境下,这类工具却很少。笔者通过自己的摸索,在集成开发环境KDevelop 1.2下 <br>
实现了一个网站下载程序,它支持文件级的“多线程下载”和“断点续传”。下面本文 <br>
分3部分介绍实现这一程序的基本技术。 <br>
基本原理 <br>
1.超级链接寻径算法 <br>
要想灵活地下载一个网站的全部或部分内容,程序就必需具备从用户指定的URL开始,沿 <br>
着它所包含的超级链接遍历整个网站的能力。在这个基础上根据用户的限制,筛选出所 <br>
要下载的文件。 <br>
从“图论”的角度分析,网站其实是一个由文件和超级链接组成的“连通有向图”。文 <br>
件是图中的顶点,超级链接是有向边。我们需要对这个有向图进行“广度优先遍历”。 <br>
为此,需要用一个队列URLQueue来存放待访问的目标。初始情况下,队列中只含有用户 <br>
指定的那个URL。程序从队头取得下载目标的URL,如果它符合用户的限制,就下载它指 <br>
向的文件。分析此文件,找出其中包括的超级链接,生成新的下载目标的URL,然后将它 <br>
们插入到队列尾部。重复以上过程,直到队列中没有符合用户限制的URL为止。 <br>
由于网站是一个“连通有向图”,所以沿着超级链接,很可能回到已经访问过的文件。 <br>
为了避免程序出现死循环,要登记已经访问过的目标。在分析下载文件的超级链接时, <br>
我们要将生成的新目标的URL与已经访问过的进行比较,剔除会造成重复访问的URL。为 <br>
了提高查询速度,我们采用了“哈希表”来存放从队头取出的URL。“哈希函数”可以采 <br>
用将URL中的字符作为整型值相加,然后模一个质数的简单方法来实现。在本文介绍的程 <br>
序中使用了质数103。 <br>
2.多线程下载和断点续传 <br>
多线程下载和断点续传使用了同一个技术。HTTP协议允许客户端在向服务器端发送下载 <br>
一个文件的GET请求时,使用“Range: bytes=a1-a2"选项,要求服务器只传送指定文 <br>
件中从第a1个字节到a2个字节之间的部分内容。因此下载一个文件时,可以将其分成若 <br>
干段,然后启动多个线程,同时与服务器建立链接,分别传送一个文件的多个部分。最 <br>
后在本地将其拼接成一个完整的文件。由于从网上下载文件时,瓶颈是在服务器端和网 <br>
络传输过程中,所以采用多线程同时下载将大大提高下载速度。 <br>
当文件传输因出现问题而中断时,程序可以将各个线程当前下载的进度和已经下载的内 <br>
容当做“断点信息”保存到文件中。用户下一次下载同一目标时,程序可以根据文件中 <br>
保留的断点信息下载上次未完成的部分,然后将整个文件拼接起来,完成下载工作。这 <br>
种技术对于在经常“掉线”的情况下下载大文件非常有利。因此,在当前流行的下载软 <br>
件中都采用了此项技术。 <br>
Linux如何启动线程 <br>
1.定义一个以void *为参数、返回void *的函数。例如,为了启动下载线程,需要 <br>
定义如下函数: <br>
void 。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -