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;