2012-02-10 61 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「;)程序將按照您的預期運行。