• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    Perl实现的Linux下socket代理服务器

    大家提供了许多linux开代理的方法,一般用到python等语言,一些服务器可能不会安装,然而perl可以说是linux标配的语言,给大家一款Perl语言的socket代理,代码非常少,而且还支持密码,效果还是不错,感觉很稳定。

    #!/usr/bin/perl 
     
    $auth_enabled = 0; 
    $auth_login = "hidden"; 
    $auth_pass = "hidden"; 
    $port = 44269; 
     
    use IO::Socket::INET; 
     
    $SIG{'CHLD'} = 'IGNORE'; 
    $bind = IO::Socket::INET->new(Listen=>10, Reuse=>1, LocalPort=>$port) or die "Нельзя забиндить порт $port\n"; 
     
    while($client = $bind->accept()) { 
    $client->autoflush(); 
     
    if(fork()){ $client->close(); } 
    else { $bind->close(); new_client($client); exit(); } 
    } 
     
    sub new_client { 
    local $t, $i, $buff, $ord, $success; 
    local $client = $_[0]; 
    sysread($client, $buff, 1); 
     
    if(ord($buff) == 5) { 
     sysread($client, $buff, 1); 
     $t = ord($buff); 
     
     unless(sysread($client, $buff, $t) == $t) { return; } 
     
     $success = 0; 
     for($i = 0; $i  $t; $i++) { 
     $ord = ord(substr($buff, $i, 1)); 
     if($ord == 0  !$auth_enabled) { 
      syswrite($client, "\x05\x00", 2); 
      $success++; 
      break; 
     } 
     elsif($ord == 2  $auth_enabled) { 
      unless(do_auth($client)){ return; } 
      $success++; 
      break; 
     } 
     } 
     
     if($success) { 
     $t = sysread($client, $buff, 3); 
     
     if(substr($buff, 0, 1) == '\x05') { 
      if(ord(substr($buff, 2, 1)) == 0) { 
      ($host, $raw_host) = socks_get_host($client); 
      if(!$host) { return; } 
      ($port, $raw_port) = socks_get_port($client); 
      if(!$port) { return; } 
      $ord = ord(substr($buff, 1, 1)); 
      $buff = "\x05\x00\x00".$raw_host.$raw_port; 
      syswrite($client, $buff, length($buff)); 
      socks_do($ord, $client, $host, $port); 
      } 
     } 
     } else { syswrite($client, "\x05\xFF", 2); }; 
    } 
    $client->close(); 
    } 
     
    sub do_auth { 
    local $buff, $login, $pass; 
    local $client = $_[0]; 
     
    syswrite($client, "\x05\x02", 2); 
    sysread($client, $buff, 1); 
     
    if(ord($buff) == 1) { 
     sysread($client, $buff, 1); 
     sysread($client, $login, ord($buff)); 
     sysread($client, $buff, 1); 
     sysread($client, $pass, ord($buff)); 
     
     if($login eq $auth_login  $pass eq $auth_pass) { 
     syswrite($client, "\x05\x00", 2); 
     return 1; 
     } else { syswrite($client, "\x05\x01", 2); } 
    } 
     
    $client->close(); 
    return 0; 
    } 
     
    sub socks_get_host { 
    local $client = $_[0]; 
    local $t, $ord, $raw_host; 
    local $host = ""; 
     
    sysread($client, $t, 1); 
    $ord = ord($t); 
    if($ord == 1) { 
     sysread($client, $raw_host, 4); 
     @host = $raw_host =~ /(.)/g; 
     $host = ord($host[0]).".".ord($host[1]).".".ord($host[2]).".".ord($host[3]); 
    } elsif($ord == 3) { 
     sysread($client, $raw_host, 1); 
     sysread($client, $host, ord($raw_host)); 
     $raw_host .= $host; 
    } elsif($ord == 4) { 
     #ipv6 - not supported 
    } 
     
    return ($host, $t.$raw_host); 
    } 
     
    sub socks_get_port { 
    local $client = $_[0]; 
    local $raw_port, $port; 
    sysread($client, $raw_port, 2); 
    $port = ord(substr($raw_port, 0, 1))  8 | ord(substr($raw_port, 1, 1)); 
    return ($port, $raw_port); 
    } 
     
    sub socks_do { 
    local($t, $client, $host, $port) = @_; 
     
    if($t == 1) { socks_connect($client, $host, $port); } 
    elsif($t == 2) { socks_bind($client, $host, $port); } 
    elsif($t == 3) { socks_udp_associate($client, $host, $port); } 
    else { return 0; } 
     
    return 1; 
    } 
     
    sub socks_connect { 
    my($client, $host, $port) = @_; 
    my $target = IO::Socket::INET->new(PeerAddr => $host, PeerPort => $port, Proto => 'tcp', Type => SOCK_STREAM); 
     
    unless($target) { return; } 
     
    $target->autoflush(); 
    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; } 
     } 
    } 
    } 
     
    sub socks_bind { 
    my($client, $host, $port) = @_; 
    } 
     
    sub socks_udp_associate { 
    my($client, $host, $port) = @_; 
    }
    您可能感兴趣的文章:
    • linux下开启php的sockets扩展支持实例
    • Linux下高并发socket最大连接数所受的各种限制(详解)
    • 详解Linux的SOCKET编程
    • C语言实现Linux下的socket文件传输实例
    • Linux网络编程之UDP Socket程序示例
    • Linux网络编程之socket文件传输示例
    • linux socket通讯获取本地的源端口号的实现方法
    上一篇:perl之print,printf,sprintf使用案例详解
    下一篇:perl数据库添加、删除、更新、查询操作例子
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    Perl实现的Linux下socket代理服务器 Perl,实现,的,Linux,下,socket,