当前位置:编程学习 > 网站相关 >>

Perl写的NetCat(nc)

by 云舒 
      这 个机器有多古老?4.6-RELEASE FreeBSD,没有gcc,没有make,连系统都乱七八糟的,port都不好使,pkg_add -r安装包都会有问题,真是无语了,还好有安装了一个perl 5.8.8。修理Port花了半天时间,硬是没搞好。想想也不划算,把紧急要用的一些小工具花一会儿功夫自己做一个出来算了,于是有了这个简单的perl 版nc,不过我没支持-e参数,用不着。

#!/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 );

补充:综合编程 , 安全编程 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,