Perl - создание сокета - PullRequest
       1

Perl - создание сокета

0 голосов
/ 10 февраля 2012

Я пытаюсь создать сокет, который подключается к веб-сайту и отправляет запрос 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 ]

2 голосов
/ 10 февраля 2012

Используйте это вместо:

#!/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 голос
/ 16 января 2015

Я не могу поверить, что этот вопрос так же стар, как и у него до сих пор нет технически правильного ответа.

Проблема в том, что вы приказываете своей программе умереть, несмотря ни на что. В конце IO :: Socket :: INET-> new () у вас есть точка с запятой, завершающая этот оператор. Следующее утверждение - die "Error: $?"; который ВСЕГДА умрет. $! просто установлено значение «Незаконный поиск» - вы не создали эту ошибку, и в вашей программе нет ничего другого, это только что $? в данный момент установлено на.

Ничто не вызывает ошибку, кроме того, что вы заменили "или" на ";" после IO :: Select :: INET-> new () (или перед смертью, в зависимости от вашей перспективы). Удалите точку с запятой, добавьте «или», замените «googel.com» на «google.com» и добавьте двойной возврат каретки / перевод строки в конце запроса на http://tools.ietf.org/html/rfc1945 (то есть: print $ сокет "GET / HTTP / 1.0 \ r \ n \ r \ n";) и программа будет работать так, как вы ожидаете.

1 голос
/ 10 февраля 2012

Вот еще одна версия с небольшим исправлением концов строк, получающая одну строку ввода и отображающая ее.

#!/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 или одну из многих альтернатив.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...