2011-01-25 5 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)가 될 것으로 예상합니다. $_의 내용을 확인하면 다른 것을 찾을 수있을 것입니다.