#!/usr/bin/perl
use strict;
use IO::Socket;
use IO::Select;
use Getopt::Std;
my %option;getopts('lp:', %option);
# listen on local port
if( defined $option{'l'} )
{
if( !defined $option{'p'} )
{
&Usage( );
exit( -1 );
}
my $port = $option{'p'};
my $listen = IO::Socket::INET->new(Proto => 'tcp',
LocalPort => $port,
Listen => 1,
Reuse => 1) or die "Listen on port $port error: $!n";
while( my $client_sock = $listen->accept() )
{
&ProcessData( $client_sock );
}
}
# if has no -l argument, maybe want to connect to other host
if( @ARGV != 2 )
{
&Usage( );
exit( -1 );
}
my $client_sock = IO::Socket::INET->new(Proto => 'tcp',
PeerHost => $ARGV[0],
PeerPort => $ARGV[1] ) || die "Connect to $ARGV[0]:$ARGV[1] error:$!n";
&ProcessData( $client_sock );
sub ProcessData
{
my $client_sock = shift;
my $select = IO::Select->new( );
$select->add( *STDIN );
$select->add( $client_sock );
my $buffer;
while( 1 )
{
if( ! $select->exists( $client_sock ) )
{
print "waiting connection....n";
last;
}
my @ready = $select->can_read;
for my $tmp_sock(@ready)
{
if( $tmp_sock eq *STDIN )
{
if( my $recv_len = sysread( *STDIN, $buffer, 1024 ) )
{
if( ! syswrite($client_sock, $buffer) )
{
$select->remove( $client_sock );
$select->remove( *STDIN );
close( $client_sock );
last;
}
}
else
{
$select->remove( $client_sock );
$select->remove( *STDIN );
close( $client_sock );
last;
}
}
elsif( $tmp_sock eq $client_sock )
{
if( my $recv_len = sysread( $client_sock, $buffer, 1024*5 ) )
{
if( ! syswrite( *STDOUT, $buffer) )
{
$select->remove( $client_sock );
$select->remove( *STDIN );
close( $client_sock );
last;
}
}
else
{
print "socket disconnected.n";
$select->remove( $client_sock );
$select->remove( *STDIN );
close( $client_sock );
last;
}
}
}
}
}
sub Usage
{
print "simple nc.pl, code by wustyunshu@hotmail.comn";
print "this script don't support -e cmd.exe, ^_^n";
print "Usage:n";
print "t -l -p 99n";
print "t 192.168.0.1 80n";
}