【问题标题】:Perl IO::Socket::SSL with web server hangPerl IO::Socket::SSL 与 Web 服务器挂起
【发布时间】:2017-05-02 12:47:31
【问题描述】:

我在使用 IO::Socket::SSL 时遇到问题。

在正常操作下一切正常,但我遇到了一个问题,即 Web 服务器 (IIS) 锁定并且 Perl 卡住了,即使在 Web 服务器再次激活后也是如此。

我在 Windows 下将 Perl 脚本作为 exe 运行,但实际上我看不到该程序正在运行,因为它是隐藏的 - 这是代码:

sub api_action
{

$api_action = $_[0];

use IO::Socket::SSL;
$EOL = "\015\012";
$BLANK = $EOL x 2;
$remote = IO::Socket::SSL->new( Proto     => "tcp",
                     PeerAddr  => "api.xxxxx",
                     PeerPort  => "443",
            SSL_verify_mode => SSL_VERIFY_NONE,
            verify_hostname => 0,
            Timeout => 120,
                    );
unless ($remote) { print "cannot connect to API\n"; return "ERROR"
}
$remote->autoflush(1); 
print $remote "GET /API/?action=$api_action" . $BLANK;
return <$remote>;
close $remote;

}

我的想法是它已经建立了初始连接,但仍在等待 GET 命令的返回。我原以为设置超时只会导致它返回错误,但它看起来不起作用。

关于我哪里出错或我错过了什么的任何想法?

谢谢

【问题讨论】:

  • 不要使用全局变量。
  • @SinanÜnür 你认为这实际上会对我看到的错误产生影响吗?
  • 不可能知道。

标签: perl sockets ssl iis


【解决方案1】:

您实际上是通过 SSL 连接将其发送到服务器:

GET /path\r\n
\r\n

这不是有效的 HTTP/1.0 或 HTTP/1.1 请求,而是 HTTP/0.9 请求。由于 HTTP/0.9 已经过时了 20 年,我不希望 IIS 仍然支持这个旧协议,所以它在遇到这样的请求时可能会表现出意外的行为。正确的 HTTP/1.0 请求如下所示:

GET /path HTTP/1.0\r\n
Host: www.example.com\r\n
\r\n

有关如何发送正确请求以及如何正确处理响应的更多信息,请参阅HTTP/1.0HTTP/1.1 标准。

除此之外:

        SSL_verify_mode => SSL_VERIFY_NONE,
        verify_hostname => 0,

verify_hostname 在 IO::Socket::SSL 中没有意义。您可能在 LWP::UserAgent 中看到了这一点,它仅在此处相关。

在正常操作下一切正常,但我遇到了一个问题,即 Web 服务器 (IIS) 锁定并且 Perl 卡住了,即使在 Web 服务器再次激活之后也是如此。

不幸的是,这不能用作错误描述,因为不清楚您认为什么是“锁定”和“再次激活”,但基本上如果服务器行为不正常,那么客户端可能会受到此影响。

目前您正在通过读取直到 TCP 连接结束来处理请求。如果服务器行为不正常并且不会关闭此连接,那么您将永远等待。

请注意,您设置的超时可能仅与初始连接有关,与进一步读取无关。根据您使用的 IO::Socket::SSL 版本,它甚至可能无法在 Windows 上正常工作。您可以改为添加alarm(60) 或类似名称,以确保客户端不会在损坏的服务器上永远等待,或者您可以尝试使用非阻塞套接字来处理该问题。

【讨论】:

  • 谢谢你 - 让我澄清一下:“锁定”是指 IIS 服务器被请求淹没,所以我假设它不会正确响应然后“再次激活”当负载下降并且可以正常响应请求时。我认为警报听起来像我正在寻找的东西 - 就像在 print $remote GET 命令之前设置 alarm(60) 和在它之后设置 alarm(0) 一样简单吗?
  • @A-Kay:这取决于卡在哪里。我实际上希望它在从服务器读取而不是在写入时卡住。但是您可能只是将所有从连接开始的通信包装起来,直到读取完成为止。
  • 好想法@Steffen,我会带着这个跑,看看我怎么走。谢谢!
猜你喜欢
  • 1970-01-01
  • 2012-12-16
  • 2020-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-28
  • 2016-11-10
相关资源
最近更新 更多