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/

相关文章:

javascript - 我无法使用 perl 脚本获取网站内容

sockets - 套接字编程Python

android - 客户端/服务器 Android 应用程序 : Two AsyncTask. 问题

sockets - read() 形成一个未绑定(bind)的套接字?

ruby-on-rails - Rails媒体文件流通过send_data或send_file方法接受字节范围请求

http - 发布(仅)文件的正确内容类型是什么?

perl - 如何在perl中以原始字节十六进制形式打印字符串?

perl - 是否可以应用 sprintf 来格式化 HERE DOCUMENT 字符串?

c# - 服务器无法在发送 HTTP header 后附加 header

linux - 无法在@INC 中找到 Cairo.pm