Files
scripts/Perl Nachrichtenticker Chat/server.pl
2024-10-14 00:08:40 +02:00

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;
}