perl - 得到响应时 IO::Socket 超时

标签 perl sockets http-headers

我正在尝试使用 IO::Socket::INET 连接到 Web 服务(是的,我知道有很多更好的模块可以做到这一点,但我没有它们也无法添加它们,所以请不建议这样做),但我正在超时(我认为这就是它正在做的事情)等待回应。

这是我的代码的基本症结(我之前用所有正确的标题填充内容,并设置它等):

$httpSock->print($content);

my @lines = $httpSock->getlines();
foreach my $line ( @lines ) {
    print $line;
}

看来我的请求是立即提出的,然后等待大约 2 分钟,然后才吐回响应。如果我更改代码以使用原始套接字 recv而不是 getlines() ,阿拉:
$httpSock->recv($data, 1024);

我立即得到响应(尽管只有前 1024 个字符)。我在这里做错了吗?我使用的 IO::Socket 版本足够晚,autoflush默认情况下应该启用,但显式打开它似乎没有任何区别。我也可以继续从套接字读取,直到得到整个响应,但这绝对比使用 getlines() 更困惑。或 <$httpSock> .

提前致谢。

最佳答案

我在使用您发布的代码片段重新创建问题时遇到问题。这是我测试的代码:

use strict;
use warnings;
use IO::Socket;

my $httpSock = new IO::Socket::INET(
    PeerAddr => 'www.google.com',
    PeerPort => '80',
    Proto    => 'tcp',
);

my $content = "HEAD / HTTP/1.0\r\nHost: www.google.com\r\n\r\n";

$httpSock->print($content);
my @lines = $httpSock->getlines();
foreach my $line (@lines) {
    print $line;
}

结果如下:
$ time ./1.pl
HTTP/1.0 200 OK
-snip-  

real    0m0.084s
user    0m0.025s
sys 0m0.007s

关于perl - 得到响应时 IO::Socket 超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1510789/

相关文章:

regex - 在哪里可以找到 Perl 的集合正则表达式练习?

multithreading - 如何检测线程是否正在运行

node.js - Nginx socket io websockets proxy pass

java - 如何在不关闭套接字的情况下通过套接字发送图像?

java - 套接字编程:Assign name to port number

node.js - 如何获取当前在 Node/Express 中设置的 HTTP 响应 header 列表?

php - 如果自动加载,则阻止 codeigniter session 库发送 set-cookie header 参数

perl - 如何在 Perl 中检查 'inf' 值的标量?

ruby - 当前行以 ^M 结尾时追加文件中的下一行

php - 用 PHP 编写的自定义 CMS,我应该向客户端发送 HTTP 内容长度 header 吗?