Perl IO::Socket::SSL与web服务器挂起

Perl IO::Socket::SSL与web服务器挂起,perl,sockets,ssl,iis,Perl,Sockets,Ssl,Iis,我在使用IO::Socket::SSL时遇到问题 在正常操作下一切正常,但我遇到了一个问题,web服务器(IIS)被锁定,Perl被卡住,甚至在web服务器再次激活之后 我在Windows下以exe的形式运行Perl脚本,但由于程序处于隐藏状态,我实际上看不到它在运行-以下是代码: sub api_action { $api_action = $_[0]; use IO::Socket::SSL; $EOL = "\015\012"; $BLANK = $EOL x 2; $remote =

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

在正常操作下一切正常,但我遇到了一个问题,web服务器(IIS)被锁定,Perl被卡住,甚至在web服务器再次激活之后

我在Windows下以exe的形式运行Perl脚本,但由于程序处于隐藏状态,我实际上看不到它在运行-以下是代码:

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;

}
子api\u动作
{
$api_action=$_[0];
使用IO::Socket::SSL;
$EOL=“\015\012”;
$BLANK=$EOL x 2;
$remote=IO::Socket::SSL->new(Proto=>“tcp”,
PeerAddr=>“api.xxxxx”,
PeerPort=>“443”,
SSL\u verify\u mode=>SSL\u verify\u NONE,
验证_主机名=>0,
超时=>120,
);
除非($remote){print“无法连接到API\n;返回“ERROR”
}
$remote->autoflush(1);
打印$remote“GET/API/?action=$API\u action”。$BLANK;
返回;
关闭$remote;
}
我的想法是,它已经建立了初始连接,但仍在等待GET命令返回。我本以为设置超时只会导致它返回错误,但它看起来不起作用

你知道我做错了什么或错过了什么吗


谢谢

您实际上是通过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
有关如何发送正确请求以及如何正确处理响应的更多信息,请参阅和标准

除此之外:

        SSL_verify_mode => SSL_VERIFY_NONE,
        verify_hostname => 0,
验证主机名在IO::Socket::SSL中没有意义。您可能在LWP::UserAgent中看到了这一点,它仅与此相关

在正常操作下一切正常,但我遇到了一个问题,web服务器(IIS)被锁定,Perl被卡住,甚至在web服务器再次激活之后

遗憾的是,这不可用作错误描述,因为不清楚您认为“锁定”和“再次激活”,但本质上,如果服务器行为不稳定,那么客户端可能会受到此影响。p> 当前,您正在通过读取直到TCP连接结束来处理请求。如果服务器行为不稳定且无法关闭此连接,则您将永远等待


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

您实际上是在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
有关如何发送正确请求以及如何正确处理响应的更多信息,请参阅和标准

除此之外:

        SSL_verify_mode => SSL_VERIFY_NONE,
        verify_hostname => 0,
验证主机名在IO::Socket::SSL中没有意义。您可能在LWP::UserAgent中看到了这一点,它仅与此相关

在正常操作下一切正常,但我遇到了一个问题,web服务器(IIS)被锁定,Perl被卡住,甚至在web服务器再次激活之后

遗憾的是,这不可用作错误描述,因为不清楚您认为“锁定”和“再次激活”,但本质上,如果服务器行为不稳定,那么客户端可能会受到此影响。p> 当前,您正在通过读取直到TCP连接结束来处理请求。如果服务器行为不稳定且无法关闭此连接,则您将永远等待


请注意,您设置的超时可能仅与初始连接相关,而与进一步读取无关。而且它甚至可能无法在Windows上正常工作,具体取决于您使用的IO::Socket::SSL的版本。您可以添加一个
报警(60)
或类似方法,以确保客户端不会在损坏的服务器上永远等待,或者您可能会尝试使用非阻塞套接字来处理此问题。

不要使用全局变量。@SinanÜnür您认为这会对我看到的错误产生影响吗?不可能知道。不要使用全局变量。@SinanÜnür你认为这会对我看到的错误产生影响吗?这是不可能知道的。谢谢你-让我澄清一下:我说的“锁定”是指IIS服务器被请求淹没,所以我假设它不会正确响应,然后在负载下降时“再次激活”,可以正常响应请求。我认为报警听起来像我在寻找的一样-它会像在
print$remote GET
命令之前设置
alarm(60)
和之后设置
alarm(0)
一样简单吗?@A-Kay:这取决于它被卡住的位置。实际上,我希望它在从服务器读取数据时被卡住,而不是在写入数据时被卡住。但你们可以从连接开始,直到读到报警为止,把所有的通信都包装起来。好主意@Steffen,我来看看我怎么做。谢谢感谢您-让我澄清一下:所谓“锁定”,我的意思是IIS服务器被请求淹没,因此我假设它不会正确响应,然后在负载下降时“再次激活”,并可以正常响应请求。我觉得闹钟听起来像我在寻找的东西——它会像sett一样简单吗