Net-SC version 1.20
                       ===================

                               INSTALLATION

To install this module type the following:

   perl Makefile.PL
   make
   make test
   make install

                       COPYRIGHT AND LICENCE

   Copyright (C) by  Okunev Igor [email protected] 2002-2006

   All rights reserved. This program is free software;
   you can redistribute it and/or modify it under the
   same terms as Perl itself.


                       ===================


NAME
   Net::SC - perl module for create the chain from the SOCKS/HTTP proxies.

SYNOPSIS
    # CONNECT TO HOST
    # ----------------

    ...
    $self = new Net::SC(
                        Timeout         => ( $opt{'to'}  || 10      ),
                        Chain_Len       => ( $opt{'l'}   || 2       ),
                        Debug           => ( $opt{'d'}   || 0x04    ),
                        Log_File        => ( $opt{'lf'}  || undef   ),
                        Random_Chain    => ( $opt{'rnd'} || 0       ),
                        Auto_Save       => 1
                     );

    die unless ref $self;

    unless ( ( $rc = $self->connect( $host, $port ) ) == SOCKS_OKAY ) {
      print STDERR "Can't connect to $host:$port [".( socks_error($rc) )."]\n";
      exit;
    }

    $sh = $self->sh;

    print $sh, "Hello !!!\n";
    ...

    --- or ---

    ...
    $self = new Net::SC(
                        Timeout         => ( $opt{'to'}  || 10      ),
                        Chain_Len       => ( $opt{'l'}   || 2       ),
                        Debug           => ( $opt{'d'}   || 0x04    ),
                        Random_Chain    => ( $opt{'rnd'} || 0       ),
                        Auto_Save       => 0,
                        Chain_File_Data => [
                                             '200.41.23.164:1080:::4:383 b/s Argentina',
                                             '24.232.88.160:1080:::4:1155 b/s Argentina',
                                             '24.2.8.160:3128:::0:HTTP proxy',
                                           ],
                     );

    die unless ref $self;

    unless ( ( $rc = $self->connect( $host, $port ) ) == SOCKS_OKAY ) {
      print STDERR "Can't connect to $host:$port [".( socks_error($rc) )."]\n";
      exit;
    }

    $sh = $self->sh;

    print $sh, "Hello !!!\n";
    ...
    $self->close;
    ...

    #  BIND THE PORT ( only SOCKS [4/5] proxies )
    # ---------------

    ...
    $self = new Net::SC(
                        Timeout         => ( $opt{'to'}  || 10      ),
                        Chain_len       => ( $opt{'l'}   || 2       ),
                        Debug           => ( $opt{'d'}   || 0x04    ),
                        Log_file        => ( $opt{'lf'}  || undef   ),
                        Random_chain    => ( $opt{'rnd'} || 0       ),
                        Auto_save       => 1
                     );

    die unless ref $self;

    unless ( ( $rc = $self->bind( $host, $port ) ) == SOCKS_OKAY ) {
      print STDERR "Can't bind port [".( socks_error($rc) )."]\n";
      exit;
    }

    print STDOUT "Binding the port : ",
                  $self->socks_param('listen_port'), "\n";
    print STDOUT "     in the host : ",
                  $self->socks_param('listen_addr'), "\n";
    print STDOUT "     for $host\n";

    $self->configure( TIMEOUT => 45 );
    unless ( ( $rc = $self->accept() ) == SOCKS_OKAY ) {
           return $rc;
    } else {
      $sh = $self->sh;
    }

    print STDOUT 'Connect from: ',
                           $self->socks_param('listen_addr'), ':',
                           $self->socks_param('listen_port'), "\n";

    print $sh 'Hello : ', $self->socks_param('listen_addr'), "\n";
    print $sh ' port : ', $self->socks_param('listen_port'), "\n";

    print STDOUT <$sh>;
    ...

   For more information see examples: telnet_over_socks_chain.pl and
   accept_over_socks_chain.pl

DESCRIPTION
 CONSTRUCTOR
   new
         TIMEOUT         - Time Out in seconds.

         CHAIN_LEN       - Length of chain.

         DEBUG           - Debug level ( 0x00 | 0x01 | 0x02 | 0x04 )
                           0x00 - Off
                           0x01 - Debug On
                           0x02 - Write all answers of socks servers.
                           0x04 - Write all requests of socks servers.
                           0x08 - Extended error information.

         CHAIN_FILE      - Configuration file name.

         CHAIN_FILE_DATA - Array reference. ( a format same as well as
                           in a file of a configuration ). It is possible
                           to use for data transmission about chains directly,
                           without use of a file of a configuration. At use
                           of the given parameter, parameter CHAIN_FILE is
                           ignored, that is the file of a configuration
                           is not read.

         LOG_FILE        - Log file name. if undef, writing
                           all errors to STDERR or `syslogd`

         RANDOM_CHAIN    - Rule for create the chains ( 0 || 1 ).
                           0 - create chain by index...
                           1 - create chain by random...

         CHECK_DELAY     - Delay time for the next usage this proxy if
                           the last connection failed ( in seconds )

         AUTO_SAVE       - Auto save the data of chain to the cache file.

         LOG_FH          - File Descriptor of LOG file.

         SYSLOG          - 1 - Use syslogd ( for *nix ), or eventlog
                           ( for win32 ) for debug messages. Default 0.

         HTTP_CLIENT     - User-Agent name for http proxies

 METHODS
   connect   Create new connection to remote host.

              Usage:

               die unless $self->connect( $peer_host, $peer_port ) == SOCKS_OKAY;

   bind      Binding port.

              Usage:

               die unless $self->bind( $peer_host, $peer_port ) == SOCKS_OKAY;

   accept    Accepting connection over SOCKS

              Usage:

               die unless $self->accept() == SOCKS_OKAY;
               $sh = $self->sh;

   sh        Returns the sock handle

              Usage:

               $sh = $self->sh;

   close     Close the connection.

              Usage:

               $self->close;

   configure Returns [ and modify ] the current configuration options.

              Usage:

               # Change TIMEOUT
               $self->configure( TIMEOUT => 10 );

               # Returns TIMEOUT
               $timeout = $self->configure( 'TIMEOUT' );

   socks_param
             Returns parameters of the last server into the chain socks...

              Usage:

               $listen_addr = $self->socks_param( 'listen_Addr' );

              or:

               $all_param = $self->socks_param();
               $listen_addr = $all_param->{'listen_addr'};

ANY ROUTINES
       socks_error( ERROR_CODE )

        Returns the error message.

       Socks error codes:

       SOCKS_GENERAL_SOCKS_SERVER_FAILURE
       SOCKS_CONNECTION_NOT_ALLOWED_BY_RUL
       SOCKS_NETWORK_UNREACHABLE
       SOCKS_HOST_UNREACHABLE
       SOCKS_CONNECTION_REFUSED
       SOCKS_TTL_EXPIRED
       SOCKS_COMMAND_NOT_SUPPORTED
       SOCKS_ADDRESS_TYPE_NOT_SUPPORTED
       SOCKS_OKAY
       SOCKS_FAILED
       SOCKS_NO_IDENT
       SOCKS_USER_MISMATCH
       SOCKS_INCOMPLETE_AUTH
       SOCKS_BAD_AUTH
       SOCKS_SERVER_DENIES_AUTH_METHOD
       SOCKS_MISSING_SOCKS_SERVER_NET_DATA
       SOCKS_MISSING_PEER_NET_DATA
       SOCKS_SOCKS_SERVER_UNAVAILABLE
       SOCKS_TIMEOUT
       SOCKS_UNSUPPORTED_PROTOCOL_VERSION
       SOCKS_UNSUPPORTED_ADDRESS_TYPE
       SOCKS_HOSTNAME_LOOKUP_FAILURE

       $self->read_chain_data();

        Reading the configuration file.

       $self->get_socks_count

        Returns the number of the socks servers

       $self->mark_proxy ( $proxy_id, $status );

        Mark the socks server with index $proxy_id how dead
        if $status not equally SOCKS_OKAY, otherwise
        clearing counter of the connection failure...

       $self->dump_cfg_data();

        Dump socks data, in the cache file.

       $self->restore_cfg_data();

        Restore socks data, from the cache file.

NOTES
   accept method change the follow variable, which returns of the
   socks_param:

    listen_addr
    listen_port

   Methods connect, bind, accept returnings SOCKS_OKAY if it succeeded.

   Http proxies do not support bind method.

   Http proxies support only Basic auth.

CONFIG FORMAT
    #host           :   port    : uid   :   pswd    : socks_proto
    192.168.1.90    :   1080    :       :           :   5
    192.18.122.90   :   3128    : bbb   :  ccc      :   0
    ...

    You can use the comments in the configuration file, for
    this you must write `#' in the beginning of string...

THANKS
    JoNO <jonozzz[at]yahoo.com> - for ideas of a writing of support http a proxy.

SEE ALSO
   perl, RFC 1928, RFC 1929, ...

AUTHOR
    Igor V. Okunev  mailto:[email protected]
                    http://www.mts-nn.ru/~gosha
                    icq:106183300