2012-02-10 80 views
-1

我想创建一个连接到一个网站并发送GET请求的套接字,但是当我这样做时我得到一个错误。Perl - 创建一个套接字

这里是我的代码

#!/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. 
+0

这不是你需要发送的唯一东西。你错过了一些行结尾。 – 2012-02-10 13:24:53

回答

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

下面是另一个版本的行尾稍有修复,并接收一个单行的输入并显示它。

#!/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的或许多选择之一。

1

我不能相信这个问题是如此古老,仍然没有技术上正确的答案。

问题是,你告诉你的程序死了,不管是什么。在IO :: Socket :: INET-> new()的末尾,你有一个分号,终止该语句。下一条语句是“Error:$?”;这将永远死亡。 $!只是恰好被设置为“非法查找” - 您还没有创建这个错误,在您的程序中也没有其他任何东西,它只是什么?恰好在此刻设置。

除了用“;”替换“或”以外,没有任何内容导致错误。在IO :: Select :: INET-> new()之后(或死之前,取决于你的观点)。删除分号,添加“or”,将“googel.com”更改为“google.com”,并在请求结束处添加一个双回车换行/换行符http://tools.ietf.org/html/rfc1945(即:print $ socket“GET/HTTP /1.0\r\n\r\n“;)程序将按照您的预期运行。