📄 program-perl-getright.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 <= 0) {
<br> print STDERR "usage: getright <URL> <FILENAME>\n\n";
<br> print STDERR " <URL>: eg. http://www.server.dom:port/path/file.ext\n";
<br> print STDERR "<FILENAME>: eg. filename.ext\n";
<br> exit(0);
<br>} else {
<br> open(FILE, "+>>".$ARGV[1]) or die "Cannot open $ARGV[1] for
append: $!";
<br> ($length = sysseek(FILE,0,2)) =~ s!.*([0-9]+).*!$1!g;
<br> print STDERR "Attempting to resume $ARGV[1] from byte: $length\n";
<br>}
<p>if ($ARGV[0] =~ m!^ (?:http://)? (.*?) (?:\:([0-9]+))? (/.*)$!x)
<br> { ($server,$port,$path) = ($1, $2 || 80, $3); }
<p>print "[$server] [$port] [$path]\n";
<p>$socket = IO::Socket::INET->new(PeerAddr => $server,
<br>
PeerPort => $port,
<br>
Proto => 'tcp',
<br>
Type => 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 = <$socket>) =~ /HTTP\/1.[01] 206 Partial Content/))
{
<br> $reply =~ s!(.*)\r\n!$1!;
<br> print STDERR "Failed [$reply]\n";
<br> print STDERR "Invalid URL/Unrecognized Reply/Resume Not Supported.\n";
<br> close($socket); exit(0);
<br>} else {
<br> print STDERR "Received valid HTTP reply.\n";
<br>}
<p>while (($mime = <$socket>) =~ /\w+: /) {
<br> if ($mime =~ /Content\-Range\:\sbytes\s([0-9]+)\-([0-9]+)\/([0-9]+)/)
<br> { ($start,$finish,$filesize) = ($1, $2, $3); }
<br> if ($mime =~ /Content\-Length\:\s([0-9]+)/) { $total = $1; }
<br>}
<p>print STDERR "Receiving data: ";
<br>while ($data = <$socket>) {
<br> $recieved += length($data);
<br> $percentage= int((($start+$recieved) / $filesize) * 100);
<br> print STDERR $percentage."%"."\b"x(length($percentage)+1);
<br> print FILE $data;
<br>}
<p>print STDERR "100%\n";
<br>close(FILE);
<br>close($socket);
<p># Example HTTP return header:
<br>#
<br># HTTP/1.1 206
Partial content
<br># Date: Wed,
15 Nov 1995 06:25:24 GMT
<br># Last-modified:
Wed, 15 Nov 1995 04:58:08 GMT
<br># Content-Range:
bytes 21010-47021/47022
<br># Content-Length:
26012
<br># Content-Type:
image/gif
<br>
<br>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -