[Perl] Geschlossenes Socket erkennen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
smo
Beiträge: 489
Registriert: 19.12.2005 16:34:40
Lizenz eigener Beiträge: MIT Lizenz

[Perl] Geschlossenes Socket erkennen

Beitrag von smo » 26.08.2006 17:10:13

Hallo,

ich bin komplett neu in der Perl-Welt. Folgendes Skript hat mich auf Perl gebracht: Jabber-Nachricht bei Anruf an FritzBox. Hab das Skript etwas erweitert, bin aber jetzt auf ein Problem gestossen.

Nach Starten des Skripts wartet es auf Nachrichten von der FritzBox. Das Empfangen funktioniert wunderbar. Aber nach einiger Zeit (Stunden?) reagiert mein Skript nicht mehr auf eingehende Nachrichten. Starte ich das Skript in einer anderen Konsole nochmal, funktioniert dieses, die FritzBox schickt also weiterhin Nachrichten.

Aus irgendwelchen Gründen wird also anscheinend das Socket geschlossen und das Skript, genauer das while(<$sock>) reagiert darauf nicht. Wie kann ich das so anpassen, dass die Trennung erkannt und dann die Verbindung neu aufgebaut wird?

Hier die relevanten Passagen:

Code: Alles auswählen

#!/usr/bin/perl -w
use IO::Socket;
use strict;
# [...]
my $sock = new IO::Socket::INET (
        PeerAddr => $FRITZBOX,
        PeerPort => '1012',
        Proto => 'tcp'
        );
        die "Could not create socket: $!\n" unless $sock;

while(<$sock>)
{
        warn "\n\n\n================\nIncoming message from fritzBox:\n$_\n";

        if ($_ =~ /RING/){
          # [...] sendMessage
        }
}
warn "\n\nClosing Socket..\n";
close($sock);
warn "Bye.\n";
Grüsse
smo

smo
Beiträge: 489
Registriert: 19.12.2005 16:34:40
Lizenz eigener Beiträge: MIT Lizenz

Re: [Perl] Geschlossenes Socket erkennen

Beitrag von smo » 25.08.2009 19:10:41

Hallo,

kleines Update nach fast 3 Jahren. :)

Bin kein Stück schlauer war perl betrifft. Als Workaround starte ich das Skript nun alle 30 Minuten neu:

Code: Alles auswählen

#! /bin/bash

echo Initial kill if still running
PID=`pidof perl fritzjabber`
echo PID is $PID
echo Try to kill pid $PID
kill -9 $PID
echo Really starting now..
echo

while [ 1=1 ]
do
   echo Starting wrapper for fritz2jabber..
   cd ./fritz2jabber
   perl fritz2jabber &
   echo Getting PID...
   PID=`pidof perl fritzjabber`
   echo PID is $PID
   echo Wait for a while, now: `date`
   sleep 30m
   echo Try to kill pid $PID
   kill -9 $PID
   echo Next run..
   cd ..
   echo --
done
Vielleicht hilft's mal nem anderen Fritzbox-User..

smo

Antworten