在Perl上使用socks 5代理

时间:2013-09-23 08:14:11

标签: perl proxy client socks

我是Perl的新手并试图在链接中理解这个鳕鱼:http://codepaste.ru/1374/but我在理解这部分代码时遇到了一些问题:

while($client || $target) {
  my $rin = "";
  vec($rin, fileno($client), 1) = 1 if $client;
  vec($rin, fileno($target), 1) = 1 if $target;
  my($rout, $eout);
  select($rout = $rin, undef, $eout = $rin, 120);
  if (!$rout  &&  !$eout) { return; }
  my $cbuffer = "";
  my $tbuffer = "";

  if ($client && (vec($eout, fileno($client), 1) || vec($rout, fileno($client), 1))) {
    my $result = sysread($client, $tbuffer, 1024);
    if (!defined($result) || !$result) { return; }
  }

  if ($target  &&  (vec($eout, fileno($target), 1)  || vec($rout, fileno($target), 1))) {
    my $result = sysread($target, $cbuffer, 1024);
    if (!defined($result) || !$result) { return; }
    }

  if ($fh  &&  $tbuffer) { print $fh $tbuffer; }

  while (my $len = length($tbuffer)) {
    my $res = syswrite($target, $tbuffer, $len);
    if ($res > 0) { $tbuffer = substr($tbuffer, $res); } else { return; }
  }

  while (my $len = length($cbuffer)) {
    my $res = syswrite($client, $cbuffer, $len);
    if ($res > 0) { $cbuffer = substr($cbuffer, $res); } else { return; }
  }
}

任何机构都可以向我解释这些行中究竟发生了什么:

vec($rin, fileno($client), 1) = 1 if $client;
vec($rin, fileno($target), 1) = 1 if $target;

select($rout = $rin, undef, $eout = $rin, 120);

1 个答案:

答案 0 :(得分:1)

基本上,select运算符用于查找哪些文件描述符已准备就绪(可读,可写或存在错误情况)。它将等待其中一个文件描述符准备就绪或超时。

select RBITS, WBITS, EBITS, TIMEOUT

RBITS是一个位掩码,通常存储为字符串,表示select等待可读性的一组文件描述符。 RBITS的每个位表示文件描述符,该位掩码中的文件描述符的偏移量应该是系统中的文件描述符号。因此,您可以使用vec生成此位掩码。

vec EXPR, OFFSET, BITS

vec函数提供无符号整数列表的存储。 EXPR是位字符串,OFFSETEXPR中位的偏移量,BITS指定您正在读取/写入{{1}的每个元素的宽度}}

所以这两行:

EXPR

它们构成了一个掩码字符串vec($rin, fileno($client), 1) = 1; vec($rin, fileno($target), 1) = 1; ,设置了其偏移量等于文件描述符号$rin的位,以及$client的那个。

将其放入$target运营商:

select

然后select($rout = $rin, undef, $eout = $rin, 120); 将监控两个文件处理程序(select$client)的可读性,如果其中一个已准备好,$target将返回。如果没有人准备就绪,它会在120秒后返回。

selectWBITS使用相同的方法。因此,当两个文件处理程序有任何异常时,您可以推断上述EBITS行也会返回。