Sockets, using Net::TCP (Not in SL6)

The following example demonstrates TCP socket I/O. This first piece of code is the client using the Net::TCP module. It sends nloop string to the mirror and displays the progress after 1000 I/Os. The time of the whole process can be measured by $ time ./tcp_client_loop.pl server_host 7777 10000.

#!/usr/bin/perl
#
# Usage:   
#
#  # ./tcp_client_loop.pl server_host 7777 1000
#
use Net::TCP; 
my ( $y, $x); 

my ( $host, $port, $nloop) = @ARGV; 

print " host $host, port $port, nloop $nloop \n";
if( !$host || !$port || !$nloop)
{
    print " Usage: \$ ./tcp_client_loop.pl server_host 7777 nloop \n"; 
    goto finish;
}

tie $x, Net::TCP, $host, $port or die "Failed to tie \$x \n";

my $com = "probe\n";
foreach my $i (1 .. $nloop)
{
    $x = $com;                      # send a string
    $y = $x;                        # receive the answer
    if( !( $i % 1000))              # output after 1000 I/Os to save time
    {
	$y =~ s/^\s*(.*?)\s*$/$1/;  # remove blank space
	print " $i, received: $y \n"; 
    }
}
$x = "bye\n"; 

finish:
untie $x;

Here is the server that mirrors the strings. Is is started on a remote host.

#!/usr/bin/perl -w
#
# server, mirror, terminates on 'bye'
#
# usage: 
#  $ ./tcp_server_mirror.pl
#
my $text = " " x 128;
#
# main: Server Program
#
use IO::Socket::INET;

my $sock = IO::Socket::INET->new( Listen => 5, 
                                  LocalPort => 7777,
				  Reuse => 1,
                                  Proto     => 'tcp');
my $new_sock = $sock->accept();

my $count = 0; 
while(1)
{
    $count++; 
    $new_sock->recv( $text, 128);
    $text =~ s/^\s*(.*?)\s*$/$1/;
    if( $text =~ /bye/i)
    {
	$sock->close();
	exit 0;
    }
    if( !($count % 1000))
    {
	print "$count, sending $text\n";
    }
    $new_sock->send( "--- $text\n");
}