Perl - 创建一个Socket

时间:2012-02-10 12:14:27

标签: perl sockets

我试图创建一个连接到网站并发送GET请求的套接字,但是当我这样做时,我收到了错误。

这是我的代码

#!/usr/bin/perl -w 
use IO::Socket;
$socket = IO::Socket::INET->new(
PeerAddr => "www.googel.com",
PeerPort => "http(80)",
Proto => "tcp");
die "Error: $!";
print $socket "GET / HTTP/1.0";
close $socket;

,错误是:

Error: Illegal seek at socket.pl line 7.

3 个答案:

答案 0 :(得分:2)

请改用:

#!/usr/bin/perl
use strict;
use warnings;
use IO::Socket;

my $socket = IO::Socket::INET->new(
    PeerAddr => "www.googel.com",
    PeerPort => "http(80)",
    Proto => "tcp") or  # Note or instead of ;
#                 __^__
       die "Error: $!";
print $socket "GET / HTTP/1.0";
close $socket;

答案 1 :(得分:1)

这是另一个版本,对行结尾略有修复,并接收输入的单行并显示它。

#!/usr/bin/env perl
use strict;
use warnings;
use IO::Socket;

my $socket = IO::Socket::INET->new(
    PeerAddr => 'www.google.com',
    PeerPort => 'http(80)',
    Proto    => 'tcp',
) or die("Error :: $!");

print($socket "GET / HTTP/1.1\r\n");
print($socket "\r\n");
my $recv_line = <$socket>;
print $recv_line;

虽然如果您计划实际访问URL或抓取内容,我强烈建议您使用LWP :: UserAgent或其中一种替代方案。

答案 2 :(得分:1)

我无法相信这个问题已经过时了,仍然没有技术上正确的答案。

问题在于,无论如何,您都会告诉您的程序死亡。在IO :: Socket :: INET-&gt; new()的末尾,您有一个分号,终止该语句。下一个陈述是死的&#34;错误:$?&#34 ;;这将永远消亡。 $!恰好被设定为&#34;非法寻求&#34; - 您还没有创建此错误,并且您的程序中没有任何其他内容,它只是$?恰好被安排到现在。

除了您已更换&#34;或&#34;之外,没有任何错误导致错误用&#34;;&#34;在IO :: Select :: INET-&gt; new()之后(或者在死之前,取决于你的观点)。删除分号,添加&#34;或&#34;,更改&#34; googel.com&#34;到&#34; google.com&#34;,并在每个http://tools.ietf.org/html/rfc1945请求结尾添加一个双重回车/换行符(即:print $ socket&#34; GET / HTTP / 1.0 \ r \ n \ n \ r \ n&#34;;)程序将按预期运行。