#!/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, "; 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; }