尽管全新安装,LWP仍会连接问题

时间:2012-06-25 18:13:19

标签: windows perl cpan lwp

更新

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

目标

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

精化

我已经使用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

1 个答案:

答案 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。祝你好运......