Linux 版 (精华区)

发信人: tcpip (俺的昵称改了), 信区: Linux
标  题: 用perl写的http断点续传程序
发信站: 哈工大紫丁香 (Fri Oct 22 14:58:22 1999), 转信

关于下载续传(resume),已经有很多软件都支持了。最简单的是在ftp这个客户端程序

中reget命 令就行;比较著名的是wget,同时支持ftp和http以及proxy,Redhat发行版中

已经包含了它。一个 比较简单的程序是snarf,写得很简明,可供一般的程序员参考。

另外有个人用perl写了个http续 传的脚本Get Right,收录在这儿供perl程序员参考.不

知是否有人在写类似NetAnts的分段下载的 软件? 

---------------------- 

#!/usr/bin/perl 

use IO::Socket; 

if ($#ARGV <= 0) { 

print STDERR "usage: getright <URL> <FILENAME>\n\n"; 

print STDERR " <URL>: eg. http://www.server.dom:port/path/file.ext\n"; 

print STDERR "<FILENAME>: eg. filename.ext\n"; 

exit(0); 

} else { 

open(FILE, "+>>".$ARGV[1]) or die "Cannot open $ARGV[1] for append: $!"; 

($length = sysseek(FILE,0,2)) =~ s!.*([0-9]+).*!$1!g; 

print STDERR "Attempting to resume $ARGV[1] from byte: $length\n"; 



if ($ARGV[0] =~ m!^ (?:http://)? (.*?) (?:\:([0-9]+))? (/.*)$!x) 

{ ($server,$port,$path) = ($1, $2 || 80, $3); } 

print "[$server] [$port] [$path]\n"; 

$socket = IO::Socket::INET->new(PeerAddr => $server, 

PeerPort => $port, 

Proto => 'tcp', 

Type => SOCK_STREAM) or die "Cannot conne

ct: $!"; 

print $socket "GET $path HTTP/1.0\n"; 

print $socket "Host: $server\n"; 

print $socket "Range: bytes=$length-\n"; 

print $socket "Connection: close\n\n"; 

if (!(($reply = <$socket>) =~ /HTTP\/1.[01] 206 Partial Content/)) { 

$reply =~ s!(.*)\r\n!$1!; 

print STDERR "Failed [$reply]\n"; 

print STDERR "Invalid URL/Unrecognized Reply/Resume Not Supported.\n"; 

close($socket); exit(0); 

} else { 

print STDERR "Received valid HTTP reply.\n"; 



while (($mime = <$socket>) =~ /\w+: /) { 

if ($mime =~ /Content\-Range\:\sbytes\s([0-9]+)\-([0-9]+)\/([0-9]+)/) 

{ ($start,$finish,$filesize) = ($1, $2, $3); } 

if ($mime =~ /Content\-Length\:\s([0-9]+)/) { $total = $1; } 



print STDERR "Receiving data: "; 

while ($data = <$socket>) { 

$recieved += length($data); 

$percentage= int((($start+$recieved) / $filesize) * 100); 

print STDERR $percentage."%"."\b"x(length($percentage)+1); 

print FILE $data; 



print STDERR "100%\n"; 

close(FILE); 

close($socket); 

# Example HTTP return header: 



#HTTP/1.1 206 Partial content 

#Date: Wed, 15 Nov 1995 06:25:24 GMT 

#Last-modified: Wed, 15 Nov 1995 04:58:08 GMT 

#Content-Range: bytes 21010-47021/47022 

#Content-Length: 26012 

#Content-Type: image/gif 


--
☆ 来源:.哈工大紫丁香 bbs.hit.edu.cn.[FROM: bin@mtlab.hit.edu.cn]
※ 修改:.tcpip 于 Oct 22 15:00:29 修改本文.[FROM: mtmail.hit.edu.c]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:3.728毫秒