我一直试图调试这个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";
}
...
答案 0 :(得分:1)
有一个错字。 @$
应该是$@
。
要删除“可能的拼写错误”消息,并且$empty
和$junk
似乎在您的代码中未使用,请写下:
my @result = unpack("C C C6", $recv);
if ($result[1] == 0x5A) {
# ...
}
答案 1 :(得分:1)
只是旁注:我认为你在考虑$ @而不是@ $。您需要将代码括在
中eval { ... };
构造。参见:
my $look;
eval { $look = IO::Socket::INET->new( PeerAddr => $_, Proto => 'tcp', Timeout => 5 ) };
if ($@) {
do_something_with($@);
}
当然,这不回答原来的问题:)
答案 2 :(得分:0)
错误消息表示PeerAddr
来电中IO::Socket::INET->new
的参数值无效。
构造函数要求PeerAddr
值为主机名或IP地址(nnn.nnn.nnn.nnn)。检查$_
的内容,我打赌你会找到不同的东西。