2011-01-25 16 views
0

私はこのperl問題をしばらくデバッグしようとしていましたが、頭を悩ませていませんでした。私がしようとしているのは、接続がsocks4/5接続の場合は、determainです。 (私が追加または@ $を死ぬ前に、最後に)Perlソケット接続チェック

# ./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"; 
      } 
... 

答えて

1

タイプミスがあります。 @$は実際には[email protected]になります。 「可能タイプミス」のメッセージを取り除くと$empty$junkので、あなたのコード内で使用されていないように見える、書き込み得るために

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

if ($result[1] == 0x5A) { 
# ... 
} 
1

ただ、サイドノート:私はあなたが$ @を考えていると思いますが、 @ $の代わりに。コードを

eval { ... }; 

構成で囲む必要があります。参照:

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

if ([email protected]) { 
    do_something_with([email protected]); 
} 

は確かに、元の質問:)

+0

+1は 'eval'構造に言及しています。私は私の答えでそれを忘れてしまった。 –

+0

ああ、goreSplatterが言ったことの代わりに、(undef、$ granted)= unpack( "C C C6"、$ recv)を使うこともできます。 – dams

0

エラーメッセージがIO::Socket::INET->newコールでPeerAddrのためのあなたのパラメータ値が無効であることを意味に応答しないこと。

コンストラクタでは、PeerAddrの値がホスト名またはIPアドレス(nnn.nnn.nnn.nnn)であることが必要です。 $_の内容を確認すれば、違うものが見つかるはずです。