2

更新

研究一个理论,我编辑LWP/Protocol/http.pm在子程序中包含一个 sleep 语句request

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帮助调试和在代码中找到这个特定位置。

不确定它是否完全回答了问题,或者该解决方案是否长期有效。将不得不做更多的检查。

概括:

  • 使用子例程的LWP::UserAgent模块get对某些 URL 失败,报告 500 超时。
  • 只有一些URL 失败。例如www.google.com失败,但www.google.se成功。
  • 我没有其他连接问题,所有 URL 都可以通过浏览器和 ping 等 cmd 程序访问。
  • 由于这个问题,我无法使用 CPAN 或 ActivePerl 的 ppm 安装 perl 模块。
  • 安装另一个 perl 发行版后问题仍然存在。
  • 奇怪的是,使用调试器并单步执行代码会使失败的 URL 成功。
  • 我正在使用防火墙,并且允许 perl 建立连接。(不相关,因为某些 URL 成功)
  • 防火墙日志显示 perl 被允许连接失败的 URL 和非失败的 URL。(见下文)日志还显示套接字打开以侦听,但时间戳与失败的连接不匹配。

目标

  • 我主要是在寻找能够安装模块的任何解决方案。
  • 我对如何调试问题的所有建议感兴趣,不需要完整的解决方案。欢迎任何提示或提示。

细化

我使用 ActivePerl v5.14 已经有一段时间了。使用 Perl 包管理器命令和 gui 安装模块ppm效果很好,但在某些时候停止工作,报告 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,所有这些 URL 都可以访问。


预计到达时间:

奇怪的是,通过调试器运行脚本,打开跟踪并跳到最后,使之前失败的连接成功。

当脚本由于打印数千行跟踪代码而运行得更慢时,这似乎意味着存在某种“固定”的打嗝,错过的时间。


我可以将这个问题理解为某些 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

尝试获取非失败 URL (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
4

1 回答 1

0

这可能不是您问题的完整解决方案。但无论如何,这里是:

从您的“详细”问题描述看来,这是您的台式机/笔记本电脑的问题。尽管您的防火墙允许连接到您提到的网站,但 Windows 内部防火墙可能不允许“FTP”。

通常,端口 20(FTP 命令端口)和 21(FTP 数据端口)应该已添加到防火墙例外(在 Windows -开始设置控制面板→ 单击安全中心防火墙例外(选项卡)添加端口。您可以尝试将端口 20 和 21 添加到异常中。

但是,如果您连接到路由器,则可能必须端口转发端口 20 和 21。但是,这些端口默认转发,或者如果您在公司 VPN 中,那么情况就完全不同了。企业 VPN 大多明确限制端口 21,但允许端口 22(这是端口 21 的安全版本,用于 SFTP)。在这种情况下,您可能需要使用ftp_proxy

或者(如果您不想将端口 20 和 21 添加到异常中),您可以转到cpan提示符并使用ftp_proxyby:

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和 environment variable FTP_PASSIVE,如

$set | grep FTP_PASSIVE
FTP_PASSIVE=0

所以就设置好了EXPORT FTP_PASSIVE=1

这些可能是许多调试方法中的一些。老实说,没有必要摆弄库代码,因为它们在所有其他机器上都可以正常工作,通常 95% 的01mailrc.txt.gz.tmp1252下载问题是由于网络/操作系统/防火墙问题,但如果你想扩展你对 LWP 的 Perl 知识,你可以。事实上,你也应该关注CPAN::FTP::netrc. 祝你好运...

于 2012-07-20T00:49:27.077 回答