⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 program-perl-getright.html

📁 学习linux的工具书
💻 HTML
字号:
<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
<html>
<head>
   <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
   <meta name="Author" content="Edward Fu">
   <meta name="GENERATOR" content="Mozilla/4.05 [zh-CN] (X11; I; Linux 2.1.127 i686) [Netscape]">
   <title>Freesoft Linux FAQ -- 一个支持HTTP续传下载的PERL程序</title>
</head>
<body>
关于下载续传(resume),已经有很多软件都支持了。最简单的是在ftp这个客户端程序中reget命
<br>令就行;比较著名的是<a href="http://sunsite.auc.dk/ftp/pub/infosystem/wget/">wget</a>,同时支持ftp和http以及proxy,Redhat发行版中已经包含了它。一个
<br>比较简单的程序是<a href="http://www.xach.com/snarf/">snarf</a>,写得很简明,可供一般的程序员参考。另外有个人用perl写了个http续
<br>传的脚本Get Right,收录在这儿供perl程序员参考.不知是否有人在写类似NetAnts的分段下载的
<br>软件?
<p>----------------------
<br>#!/usr/bin/perl
<br>use IO::Socket;
<p>if ($#ARGV &lt;= 0) {
<br>&nbsp; print STDERR "usage: getright &lt;URL> &lt;FILENAME>\n\n";
<br>&nbsp; print STDERR "&nbsp;&nbsp;&nbsp;&nbsp; &lt;URL>: eg. http://www.server.dom:port/path/file.ext\n";
<br>&nbsp; print STDERR "&lt;FILENAME>: eg. filename.ext\n";
<br>&nbsp; exit(0);
<br>} else {
<br>&nbsp; open(FILE, "+>>".$ARGV[1]) or die "Cannot open $ARGV[1] for
append: $!";
<br>&nbsp; ($length = sysseek(FILE,0,2)) =~ s!.*([0-9]+).*!$1!g;
<br>&nbsp; print STDERR "Attempting to resume $ARGV[1] from byte: $length\n";
<br>}
<p>if ($ARGV[0] =~ m!^ (?:http://)? (.*?) (?:\:([0-9]+))? (/.*)$!x)
<br>&nbsp; { ($server,$port,$path) = ($1, $2 || 80, $3); }
<p>print "[$server] [$port] [$path]\n";
<p>$socket = IO::Socket::INET->new(PeerAddr => $server,
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
PeerPort => $port,
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
Proto&nbsp;&nbsp;&nbsp; => 'tcp',
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
Type&nbsp;&nbsp;&nbsp;&nbsp; => SOCK_STREAM) or die "Cannot connect: $!";
<p>print $socket "GET $path HTTP/1.0\n";
<br>print $socket "Host: $server\n";
<br>print $socket "Range: bytes=$length-\n";
<br>print $socket "Connection: close\n\n";
<p>if (!(($reply = &lt;$socket>) =~ /HTTP\/1.[01] 206 Partial Content/))
{
<br>&nbsp; $reply =~ s!(.*)\r\n!$1!;
<br>&nbsp; print STDERR "Failed [$reply]\n";
<br>&nbsp; print STDERR "Invalid URL/Unrecognized Reply/Resume Not Supported.\n";
<br>&nbsp; close($socket); exit(0);
<br>} else {
<br>&nbsp; print STDERR "Received valid HTTP reply.\n";
<br>}
<p>while (($mime = &lt;$socket>) =~ /\w+: /) {
<br>&nbsp; if ($mime =~ /Content\-Range\:\sbytes\s([0-9]+)\-([0-9]+)\/([0-9]+)/)
<br>&nbsp;&nbsp;&nbsp; { ($start,$finish,$filesize) = ($1, $2, $3); }
<br>&nbsp; if ($mime =~ /Content\-Length\:\s([0-9]+)/) { $total = $1; }
<br>}
<p>print STDERR "Receiving data: ";
<br>while ($data = &lt;$socket>) {
<br>&nbsp; $recieved += length($data);
<br>&nbsp; $percentage= int((($start+$recieved) / $filesize) * 100);
<br>&nbsp; print STDERR $percentage."%"."\b"x(length($percentage)+1);
<br>&nbsp; print FILE $data;
<br>}
<p>print STDERR "100%\n";
<br>close(FILE);
<br>close($socket);
<p># Example HTTP return header:
<br>#
<br>#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HTTP/1.1 206
Partial content
<br>#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Date: Wed,
15 Nov 1995 06:25:24 GMT
<br>#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Last-modified:
Wed, 15 Nov 1995 04:58:08 GMT
<br>#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Content-Range:
bytes 21010-47021/47022
<br>#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Content-Length:
26012
<br>#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Content-Type:
image/gif
<br>&nbsp;
<br>&nbsp;
</body>
</html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -