Mirroring /dev/ttyS0, including the client

The following lines of code read some input from /dev/ttyS0 and send it back the same way.

#!/usr/bin/perl -w
use strict;
use POSIX qw(:termios_h);
use FileHandle; 
my $buffer= "";
my $nfd; 

#
# root> chmod 666 /dev/ttyS0
#
sysopen( SOCK, "/dev/ttyS0", O_RDWR) or die 'Failed to open /dev/ttyS0';

my $fd = fileno( SOCK); 
my $term = POSIX::Termios->new;     
$term->getattr( $fd);
$term->setospeed( 4098);  # B115200
$term->setispeed( 4098); 
my $lflag = $term->getlflag(); 
my $c_cflag = $term->getcflag(); 
$term->setcflag( $c_cflag | &POSIX::CS8); 
$term->setattr( $fd, &POSIX::TCSANOW);

my $len; 
while(1)
{
    my $rin = my $win = my $ein = ""; 
    vec( $rin, fileno( SOCK), 1) = 1; 
    $ein = $rin | $win;
    $nfd = select( $rin, $win, $ein, 0.2);
    if( $nfd)
    {
        $buffer = ""; 
        $len = sysread( SOCK, $buffer, 100, 0);
        print " --- len $len $buffer \n"; 
        $len = syswrite( SOCK, $buffer, length( $buffer), 0);
    }
}

finish:
close SOCK;

The following lines are a client that uses the mirror to do some network tests.

#!/usr/bin/perl -w
use strict; 
#
# need this because the file handle $sck is 'variable'
#
no strict 'refs'; 

use Socket;
use Fcntl; 
  
my ($remote, $port, $iaddr, $paddr, $proto, $line); 

$remote = 'hasptsXX.desy.de';
$port = 10015; 
$port = getservbyname( $port, 'tcp') if( $port =~ /\D/); 
die " no port " unless $port; 

$iaddr = inet_aton( $remote) or die "no host $remote"; 
$paddr = sockaddr_in( $port, $iaddr); 
$proto = getprotobyname( 'tcp'); 
#
# allow for 'non-static' filehandles
#
my $sck = "SOCK"; 
socket( $sck, PF_INET, SOCK_STREAM, $proto) or die "socket: $!"; 
connect( $sck, $paddr) or die "connect: $!";
#
# set the socket to 'blocking'
#
my $flags = fcntl( $sck, F_GETFL(), 0);
$flags  &= ~O_NONBLOCK();    # Clear non-blocking, but preserve other flags
fcntl( $sck, F_SETFL(), $flags);
my $buffer = ""; 
while(1)
{
#
# send the command
# 
    my $com = "dies ist ein test ein etwas laengerer text abcdefghijklmnop\n"; 
    syswrite( $sck, $com, length($com), 0); 
    print "\n";
    my $argout = ""; 
    while(1)
    {
#
# test whether we have input
#
        my $rin = my$win = my $ein = ""; 
        vec( $rin, fileno( $sck), 1) = 1; 
        $ein = $rin | $win; 
        my $tmo = 0.5; 
        (my $nfound, my $remaining) = select( $rin, $win, $ein, $tmo); 
        if( !$nfound)
        {
            last;
        }
        my $used = 0.5 - $remaining; 
        print " time used $used\n"; 
#
# get the input
#
        $buffer = ""; 
        my $len = sysread( $sck, $buffer, 100, 0); 
        $argout .= $buffer; 
        print " received len $len $argout\n"; 
    }
}
close( $sck); 
exit;