120 lines
3.3 KiB
Perl
120 lines
3.3 KiB
Perl
#!/usr/bin/perl
|
|
use Thread;
|
|
use IO::Socket::Multicast;
|
|
use JSON::XS;
|
|
|
|
my @messages :shared;
|
|
|
|
if ($ARGV[1] eq "") { wrong_start(); }
|
|
|
|
my $MCASTIP :shared;
|
|
my $MCASTPORT :shared;
|
|
my $TCPIP :shared;
|
|
my $TCPPORT :shared;
|
|
|
|
($MCASTIP,$MCASTPORT) = split(/:/, $ARGV[0]);
|
|
($TCPIP,$TCPPORT) = split(/:/, $ARGV[1]);
|
|
|
|
if ($MCASTIP eq "" or $MCASTPORT eq "" or $TCPIP eq "" or $TCPPORT eq "") { wrong_start(); }
|
|
|
|
open MSG, "<messages";
|
|
@messages=<MSG>;
|
|
close MSG;
|
|
|
|
foreach (@messages) {
|
|
chomp;
|
|
}
|
|
|
|
$thr = new Thread \&SendMessage;
|
|
$thr = new Thread \&ReceiveMessage;
|
|
|
|
while(1) { sleep 1; }
|
|
|
|
sub SendMessage {
|
|
# my $ThreadID=Thread->self;
|
|
|
|
# multicast socket zum senden von nachrichten öffnen
|
|
$sock = IO::Socket::Multicast->new(Proto=>'udp',PeerAddr=>"$MCASTIP:$MCASTPORT");
|
|
$sock->mcast_ttl(8);
|
|
|
|
# ein neues json objekt anlegen
|
|
my $JSONObject = JSON::XS->new->ascii->pretty->allow_nonref();
|
|
|
|
# array mit zu sendenden daten
|
|
my @sendarray;
|
|
|
|
# json verpackte daten
|
|
my $senddata;
|
|
|
|
# daten zum senden zusammenbauen
|
|
while (1) {
|
|
# zu sendende daten leeren
|
|
@sendarray=();
|
|
|
|
# erstes element enthält start signatur und ip und port des tcp servers für autokonfig
|
|
push @sendarray, "STARTOFMESSAGES#$TCPIP#$TCPPORT";
|
|
|
|
# nachrichten in datei speichern um bei neustart des servers die alten daten zu haben
|
|
open MSG, ">messages";
|
|
|
|
# letzte 20 nachrichten
|
|
for($i=-20;$i<=-1;$i++) {
|
|
if (exists $messages[$i]) {
|
|
# in array anfügen um mitzusenden
|
|
push @sendarray, "$messages[$i]";
|
|
# in datei speichern
|
|
printf MSG "$messages[$i]\n";
|
|
}
|
|
}
|
|
# ende signatur anhängen
|
|
push @sendarray, "ENDOFMESSAGES";
|
|
|
|
# messages datei schließen
|
|
close MSG;
|
|
|
|
# daten aus array zu json objekt kodieren
|
|
$senddata=$JSONObject->encode(\@sendarray);
|
|
|
|
# daten per multicast senden
|
|
$sock->send("$senddata");
|
|
|
|
# eine sekunde warten bis daten erneut gesendet werden
|
|
sleep (1);
|
|
}
|
|
}
|
|
|
|
sub ReceiveMessage {
|
|
$tcpsock=new IO::Socket::INET(LocalHost=>"$TCPIP", LocalPort=> $TCPPORT, Proto=>'tcp', Listen=>5, Reuse=>1);
|
|
|
|
while ($tcp_sock=$tcpsock->accept()) {
|
|
while (defined ($buf=<$tcp_sock>)) {
|
|
$time = localtime;
|
|
$buf = sprintf "%s(%24s)",$buf,$time;
|
|
|
|
@messages=(@messages, $buf);
|
|
print "\e[2J";
|
|
foreach (@messages) {
|
|
print "$_\n";
|
|
}
|
|
}
|
|
}
|
|
close ($sock);
|
|
}
|
|
|
|
sub wrong_start {
|
|
print "\n\nserver MCASTIP:MPort TCPIP:TPort\n\n",
|
|
" MCASTIP Multicast Adresse an die Nachrichten gesendet werden\n",
|
|
" Bsp 239.1.1.1\n\n",
|
|
" MPort Port der für die Multicast Nachrichten verwendet wird\n",
|
|
" Bsp 64000\n\n",
|
|
" TCPIP IP Adresse auf die Server hören soll\n",
|
|
" Bsp 0.0.0.0\n\n",
|
|
" TPort Port auf den Server hören soll\n",
|
|
" Bsp 64001\n\n",
|
|
" Beispielaufruf\n",
|
|
" server 239.1.1.1:64000 0.0.0.0:64001\n\n",
|
|
" Falsche IPs und/oder Ports werden nicht! abgefangen\n\n";
|
|
|
|
exit;
|
|
}
|