在理论上,我编辑了LWP/Protocol/http.pm
以在子例程request
中包含一个sleep语句:
if (!$has_content || $write_wait || $has_content > 8*1024) {
WRITE:
{
# Since this just writes out the header block it should almost
# always succeed to send the whole buffer in a single write call.
my $n = $socket->syswrite($req_buf, length($req_buf));
sleep 2; ## <----- NEW
unless (defined $n) {
...
get
语句有效,返回200 OK
。非常感谢Alan Curry帮助调试并在代码中找到这个特定位置。
不确定它是否完全回答了问题,或者解决方案是否能长期运行。将不得不做更多的检查。
get
子例程的www.google.com
失败,但www.google.se
成功。我已经使用ActivePerl v5.14一段时间了。使用Perl Package Manager ppm
命令安装模块并且gui运行良好,但在某些时候停止工作,报告500超时。 cpan shell报告了同样的事情。
我已经广泛搜索过这个问题,但没有发现任何与我的问题相关的问题,或以任何方式提供帮助。
ActivePerl支持声称它可能是代理设置,这是荒谬的。我有很多连接到互联网的程序,不需要代理设置,据我所知,我不需要这样做。我试图找出我的代理设置是什么,如果有的话,但我发现的唯一的事情是模糊的引用,如“使用系统设置”,“无需代理”和“代理与您的IP相同”。
所以昨晚我已经足够安装了草莓perl,但它遇到了同样的问题。之后我卸载了ActivePerl。
无论如何,我已经尝试了LWP模块,发现我可以在那里重现错误。它似乎仅限于某些网站,而cpan就是其中之一(?)。我创建了这个脚本用于测试:
use strict;
use warnings;
use LWP::UserAgent;
use URI;
my $ua = LWP::UserAgent->new;
my $url = shift;
my $u = URI->new($url);
$ua->no_proxy('cpan.strawberryperl.com','cpan.com',$u->host);
$ua->timeout(30);
my $r = $ua->get($url);
if ($r->is_success) {
print $r->decoded_content;
} else {
die $r->status_line;
}
然后做了一些测试:
tx.pl http://cpan.strawberryperl.com/authors/01mailrc.txt.gz
500 read timeout at tx.pl line 23.
tx.pl http://stackoverflow.com
500 read timeout at tx.pl line 23.
tx.pl http://www.google.se
<!doctype html><html itemscope itemtype="http://schema.org/WebPage"><head><meta
http-equiv="content-type" content="text/html; charset=ISO-8859-1"><meta ...
因此,谷歌工作,www.youtube.com也有效,但www.yahoo.com和search.cpan.com失败。默认超时180秒使调试非常烦人,这就是我在脚本中减少它的原因。毋庸置疑,如果我尝试使用Firefox或ping来访问它们,则可以访问所有这些URL。
ETA:
奇怪的是,通过调试器运行脚本,打开跟踪并跳到最后使先前失败的连接成功。
这似乎意味着存在某种打嗝,当脚本由于打印数千行跟踪代码而运行得更慢时,错过的时间被“修复”。
我可以理解这个问题是因为某些ActivePerl模块被破坏了,但是草莓perl正在使用一组完全不同的文件,因此它必须是我的系统。
为什么有些网站会运作而有些网站却不是很令人困惑。我可以理解像stackoverflow.com这样的网站会保护自己免受潜在的机器人攻击,但为什么cpan会阻止它自己的软件包管理器毫无意义。
我正在使用防火墙,并且允许Perl建立连接。我的系统是一个相当旧的Windows XP安装(约5年)。在使用Ubuntu运行双启动时,我从未遇到过这个问题,这是另一个线索,它与代理没有关系。
我很好,真的很难过。如果有人能帮助我调试这个,我将非常感激。
下面的CPAN shell错误消息。有趣的是,它说它试图使用ftp作为最后的手段,但我刚发现我的防火墙不允许使用ftp命令,如果使用它,它应该请求我的许可。
Fetching with LWP:
http://cpan.strawberryperl.com/authors/01mailrc.txt.gz
LWP failed with code[500] message[read timeout]
Warning: no success downloading 'D:\strawberry\cpan\sources\authors\01mailrc.txt
.gz.tmp1252'. Giving up on it.
Fetching with LWP:
http://www.cpan.org/authors/01mailrc.txt.gz
LWP failed with code[500] message[read timeout]
Warning: no success downloading 'D:\strawberry\cpan\sources\authors\01mailrc.txt
.gz.tmp1252'. Giving up on it.
Warning: no success downloading 'D:\strawberry\cpan\sources\authors\01mailrc.txt
.gz.tmp1252'. Giving up on it.
As a last resort we now switch to the external ftp command 'C:\WINDOWS\system32\
ftp.EXE'
to get 'D:\strawberry\cpan\sources\authors\01mailrc.txt.gz.tmp1252'.
Doing so often leads to problems that are hard to diagnose.
If you're the victim of such problems, please consider unsetting the
ftp config variable with
o conf ftp ""
o conf commit
Please check, if the URLs I found in your configuration file
(http://cpan.strawberryperl.com/, http://www.cpan.org/) are valid. The
urllist can be edited. E.g. with 'o conf urllist push ftp://myurl/'
Could not fetch authors/01mailrc.txt.gz
尝试获取非失败网址(www.google.se)并失败的防火墙日志(stackoverflow.com):
2012-06-27T18:34:04+01:00,info,appl control,C:\WINDOWS\system32\svchost.exe,allow,listen,17,0.0.0.0,56564
2012-06-27T18:34:04+01:00,info,appl control,C:\WINDOWS\system32\svchost.exe,allow,send,17,195.54.122.198,53
2012-06-27T18:34:13+01:00,info,appl control,D:\strawberry\perl\bin\perl.exe,allow,connect out,6,64.34.119.12,80
2012-06-27T18:34:13+01:00,info,appl control,D:\strawberry\perl\bin\perl.exe,allow,connect out,6,64.34.119.12,80
2012-06-27T18:34:21+01:00,info,appl control,C:\Program\Mozilla Firefox\firefox.exe,allow,connect out,6,74.86.70.106,80
2012-06-27T18:34:28+01:00,info,appl control,C:\Program\Mozilla Firefox\firefox.exe,allow,connect out,6,64.34.119.12,80
2012-06-27T18:34:30+01:00,info,appl control,C:\WINDOWS\system32\svchost.exe,allow,listen,17,0.0.0.0,56664
2012-06-27T18:34:30+01:00,info,appl control,C:\WINDOWS\system32\svchost.exe,allow,send,17,195.54.122.198,53
2012-06-27T18:34:30+01:00,info,appl control,D:\strawberry\perl\bin\perl.exe,allow,connect out,6,74.125.143.94,80
2012-06-27T18:34:30+01:00,info,appl control,D:\strawberry\perl\bin\perl.exe,allow,connect out,6,74.125.143.94,80
2012-06-27T18:35:14+01:00,info,appl control,C:\Program\Mozilla Firefox\firefox.exe,allow,connect out,6,64.34.119.12,80
2012-06-27T18:35:21+01:00,info,appl control,C:\Program\Mozilla Firefox\firefox.exe,allow,connect out,6,74.86.70.106,80
2012-06-27T18:36:21+01:00,info,appl control,C:\Program\Mozilla Firefox\firefox.exe,allow,connect out,6,74.86.70.106,80
2012-06-27T18:37:04+01:00,info,appl control,C:\WINDOWS\system32\svchost.exe,allow,listen,17,0.0.0.0,61215
2012-06-27T18:37:04+01:00,info,appl control,C:\WINDOWS\system32\svchost.exe,allow,send,17,195.54.122.198,53
2012-06-27T18:37:07+01:00,info,appl control,D:\strawberry\perl\bin\perl.exe,allow,connect out,6,64.34.119.12,80
2012-06-27T18:37:07+01:00,info,appl control,D:\strawberry\perl\bin\perl.exe,allow,connect out,6,64.34.119.12,80
答案 0 :(得分:0)
这可能不是您问题的完整解决方案。但无论如何它在这里:
根据您的“详细”问题说明,您的桌面/笔记本电脑出现了问题。即使您提到的防火墙允许连接到网站,Windows内部防火墙也可能不允许“FTP”。
通常,端口20(FTP命令端口)和21(FTP数据端口)应该已添加到防火墙例外(在Windows中 - 开始→设置→< em>控制面板→单击安全中心→防火墙→例外(选项卡)→添加端口。您可以尝试将端口20和21添加到例外中。
但是,如果您连接到路由器,则可能必须端口转发端口20和21.但是,默认情况下会转发这些端口,或者如果您在公司VPN中,那么这是一个完全不同的故事。企业VPN主要限制端口21但是允许端口22(对于SFTP,它是端口21的安全版本)。在这种情况下,您可能需要使用 ftp_proxy 。
或者(如果您不想将端口20和21添加到例外),您可以转到cpan
提示并使用ftp_proxy
:
cpan> o conf ftp_proxy http://your.ftpproxy.com
然后发出install <module>
命令。或者,您可以更新../CPAN/config.pm
文件,以便对ftp_proxy
参数进行永久性更改。
嗯,这些可能是您可能已经尝试过的传统解决方案。下一步是尝试将FTP_PASSIVE
模式设置为1
。默认情况下,此libnetcfg
配置设置为0
。要更改此设置,请找到libnetcfg.bat
文件(它应该位于某个地方C:\Perl\bin
)。在编辑器中打开文件并替换
ftp_int_passive 0
与
ftp_int_passive 1
这是在调用CPAN
来设置环境变量时运行的Windows批处理文件。在类似UNIX / Linux的架构下,它被发现为libnet.cfg
和环境变量FTP_PASSIVE
,如
$set | grep FTP_PASSIVE
FTP_PASSIVE=0
所以只设置EXPORT FTP_PASSIVE=1
。
这可能是调试此问题的众多方法中的一小部分。老实说,没有必要摆弄库代码,因为它们适用于其他所有机器,通常95%的01mailrc.txt.gz.tmp1252
下载问题是由网络/操作系统/防火墙问题引起的,但是如果你想扩展你的Perl知识您可以使用LWP。事实上,你也应该看CPAN::FTP::netrc
。祝你好运......