$mb_fc = 3;
if ($opt_t) {
unless ($opt_g) {
# wenn nicht lesen, dann schreiben
$mb_fc = 16;
@data = @ARGV;
$count = $#data + 1;
}
}
$ta_id = 1234; # beliebig
$prot_id = 502; # " - aber in Anlehung an die Portnummer
# Verbindungsdaten festlegen
if ($port =~ /\D/) { $port = getservbyname($port, 'tcp') }
die "No Port" unless $port;
$iaddr = inet_aton($remote) or die "No Host: $remote";
$paddr = sockaddr_in($port, $iaddr);
$proto = getprotobyname('tcp');
while ( 1 ) {
# dieser Client hält eine dauernde Verbindung zum Server
# dies erlaubt die kontinuierliche Beobachtung der Simulation
socket(SOCK, PF_INET, SOCK_STREAM, $proto) or die "socket: $!";
connect(SOCK, $paddr) or die "connect: $!";
if ( $mb_fc == 0x10 ) {
# binär kodieren - Big Endian
$line .= pack 'Cn*', 2*$count, @data;
}
# und absenden
send SOCK, $line, 0;
# ein wenig Geduld zeigen - hier 100 msec
select(undef, undef, undef, 0.1);
# und auf Antwort warten
next unless defined(recv SOCK, $ans, 6+3+2*$count, 0);
# Wenn der Server die Verbindung nicht schließt, dann tun wir das
close (SOCK);
# und bereiten die Ausgabe vor
my $header = substr($ans, 0, 6);
my ($tid, $prid, $hilen, $lolen) = unpack 'nnCC', $header;
my ($unit, $fc, $bc) = unpack 'C*', substr($ans, 6, 3);
# binär dekodieren
@data = unpack 'n*', substr($ans, 9);
my $len = 0x100 * $hilen + $lolen;
print "Unit $unit(Ref $ref): ";
foreach (@data) {
printf "%5d ", $_;
}
print "\n";
if ( $mb_fc == 0x10 ) {
# wenn wir nur geschrieben haben, Schluß
exit;
}
}
exit;
# That's it