Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- use strict;
- use threads;
- use threads::shared;
- use IO::Socket;
- use IO::Socket::Socks ':constants';
- use IO::Select;
- my ($listenaddr, $listenport) = ("localhost", "12593");
- my $filename = "proxies.txt";
- my $useproxy :shared = 1;
- my @proxylist :shared;
- sub readlist {
- lock @proxylist;
- open F, "<$filename";
- chomp(@proxylist = <F>);
- close F;
- }
- &readlist;
- threads->create(sub {
- sleep(5);
- \&readlist;
- });
- my $sc_srv = IO::Socket::Socks->new(ProxyAddr => $listenaddr,
- ProxyPort => $listenport,
- Listen => 1,
- SocksResolve => 1,
- SocksVersion => 4);
- my $sel_srv = IO::Select->new($sc_srv);
- my $ss;
- while(1) {
- if ($sel_srv->can_read()) {
- $ss = $sc_srv->accept();
- if (!defined($ss)) {
- next;
- }
- threads->create(\&do_client, $ss);
- }
- }
- sub do_client {
- my $sc_in = shift;
- my $sc_out;
- my ($command, $remoteaddr, $remoteport, $type) = @{$sc_in->command()};
- my ($proxyaddr, $proxyport);
- if($useproxy) {
- lock @proxylist;
- my $proxystr = shift @proxylist;
- ($proxyaddr, $proxyport) = split(':', $proxystr);
- push @proxylist, $proxystr;
- }
- if ($command != CMD_CONNECT) {
- $sc_in->command_reply(REQUEST_FAILED, $remoteaddr, $remoteport);
- $sc_in->close;
- return;
- }
- print "connecting to $remoteaddr:$remoteport...\n";
- if(!$useproxy) {
- $sc_out = IO::Socket::INET->new(PeerAddr => $remoteaddr,
- PeerPort => $remoteport,
- Proto => 'tcp');
- }
- else {
- print "using proxy $proxyaddr:$proxyport\n";
- $sc_out = IO::Socket::Socks->new(ProxyAddr => $proxyaddr,
- ProxyPort => $proxyport,
- ConnectAddr => $remoteaddr,
- ConnectPort => $remoteport,
- Timeout => 10);
- }
- if(!$sc_out) {
- $sc_in->command_reply(REQUEST_FAILED, $remoteaddr, $remoteport);
- $sc_in->close;
- return;
- }
- $sc_in->command_reply(REQUEST_GRANTED, $remoteaddr, $remoteport);
- print "connected!\n";
- my $data;
- my $size = 2048;
- my $f = 1;
- while($f != 0) {
- my ($sel_in, $sel_out) = (IO::Select->new($sc_in),IO::Select->new($sc_out));
- while($f && $sel_in->can_read(0.01)) {
- $data = '';
- $sc_in->recv($data, $size);
- if(!$data) {
- $f = 0;
- }
- else {
- $sc_out->send($data);
- }
- }
- while($f && $sel_out->can_read(0.01)) {
- $data = '';
- $sc_out->recv($data, $size);
- if(!$data) {
- $f = 0;
- }
- else {
- $sc_in->send($data);
- }
- }
- }
- print "disconnected\n";
- $sc_out->close;
- $sc_in->close;
- }
Add Comment
Please, Sign In to add comment