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;