Проверка соединения с сокетом Perl - PullRequest
0 голосов
/ 25 января 2011

Я пытался отладить эту проблему perl некоторое время, но безрезультатно. то, что я пытаюсь сделать, это определить, является ли соединение socks4 / 5.

# ./pctest.pl
Name "main::junk" used only once: possible typo at ./pctest.pl line 60.
Name "main::empty" used only once: possible typo at ./pctest.pl line 60.
IO::Socket::INET: Bad hostname 'C1(X'   ...propagated at ./pctest.pl line 52.

У меня также была эта ошибка (прежде чем я добавил или умру @ $; в конце):

Can't use an undefined value as a symbol reference at ./pctest.pl line 56.

.

...
  $look = IO::Socket::INET->new( PeerAddr => $_, Proto => 'tcp', Timeout => 5 ) or die @$;

            $sock4 = pack( "CCS", 4, 1, 80 );

            print $look $sock4;

            read( $look, $recv, 10 );

            ( $empty, $granted, $junk ) = unpack( "C C C6", $recv );

            if( $granted == 0x5A )
            {
                    print " Yes\n";
            }
            else
            {
                    print " No\n";
            }
...

Ответы [ 3 ]

1 голос
/ 25 января 2011

Примечание: я думаю, что вы думаете о $ @, а не @ $.Вам необходимо заключить код в

eval { ... };

конструкцию.См .:

my $look;
eval { $look = IO::Socket::INET->new( PeerAddr => $_, Proto => 'tcp', Timeout => 5 ) };

if ($@) {
   do_something_with($@);
}

Конечно, это не отвечает на первоначальный вопрос:)

1 голос
/ 25 января 2011

Есть опечатка. @$ действительно должно быть $@.

Чтобы избавиться от сообщений о «возможной опечатке», и поскольку $empty и $junk не используются в вашем коде, напишите:

my @result = unpack("C C C6", $recv);

if ($result[1] == 0x5A) {
# ...
}
0 голосов
/ 26 января 2011

Сообщение об ошибке означает, что значение вашего параметра для PeerAddr в вызове IO::Socket::INET->new недопустимо.

Конструктор ожидает, что значение PeerAddr будет именем хоста или IP-адресом (nnn.nnn.nnn.nnn). Проверьте содержимое $_ и держу пари, что вы найдете что-то другое.

...