使用套接字发送url请求?

时间:2013-12-25 15:31:39

标签: perl sockets

我想使用套接字打开链接并阅读html代码,到目前为止我使用的是:

my $req = <<EOT
GET / ${id} HTTP/1.1
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding:identity
Accept-Language:fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4
Connection:${connection}
Host:${host}
User-Agent:Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)     Chrome/31.0.1650.63 Safari/537.36

EOT
;

$socket->send($req);


print "skipping headers\n";
while(<$socket>) { s/^(.*?)\r?\n$/\1/; last if /^\s*\r?\n?$/; }

print "Reading Chunks\n";
my $buffer = "";
while(<$socket>)
{
    last if /^HTTP/;
    next if /^.{0,5}$/;
    s/^\s*(.*?)\s*\r?\n$/\1/;
    $buffer .= $_;
}
print $buffer;

我有两个问题......

1)while(<$socket>)需要时间,当我将打印放在while循环中时,我可以看到只需添加最后一个标记</html>,所有打印其他来源,它只是挂起一分钟来添加最后一个标签。

2)我没有得到页面的真实源代码,我的意思是我们使用view-source:www.example.com得到的,我错过了什么?

编辑:

我称这个子连接在开头创建套接字

sub _connect
{
      my ($peerAdd) = @_;
     return IO::Socket::INET->new(
         PeerAddr => $peerAdd,
         PeerPort => 'http(80)',
         Proto    => 'tcp'
     )
         or die "Could not connect to $peerAdd:80!! $!"
}

提前致谢。

1 个答案:

答案 0 :(得分:5)

您发送的HTTP / 1.1请求默认为keep-alive,例如服务器保持连接打开并等待更多请求。因此,最后一次调用只会在服务器因为不活动而关闭连接时结束,在收到请求的最后几个字节之后很久。

如果你很懒,你应该只使用LWP :: UserAgent或类似的模块。如果您想要手工完成所有事情,您可以自己处理所有杂乱的事情,例如:分块编码,压缩传输,许多非标准服务器等。这远非微不足道。