使用套接字发送url请求?

Mug*_*ara 0 sockets perl

我想使用套接字打开一个链接并阅读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;
Run Code Online (Sandbox Code Playgroud)

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

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!! $!"
}
Run Code Online (Sandbox Code Playgroud)

提前致谢.

Ste*_*ich 5

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

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