Schrift
[thread]4280[/thread]

Problem mit Net::Ping nach Reconnect

Leser: 1


<< >> 7 Einträge, 1 Seite
esskar
 2005-08-03 10:29
#37990 #37990
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
Code: (dl )
1
2
use strict;
use warnings;
J-jayz-Z
 2005-08-04 01:17
#37991 #37991
User since
2005-04-13
625 Artikel
BenutzerIn
[Homepage] [default_avatar]
mit use strict und use warnings bindest du Standart Pragmas ein, die in jedes Perl Script gehören.
use warnings bewirkt nahezu das selbe wie #!/usr/bin/perl -w, schaltet also Warnungen ein. Und use strict: Les selber:
http://faq.perl-community.de/bin/view/Wissensbasis/UseStrict
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="5065726c2d436f6d6d756e697479"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'

http://perl-tutor.de
J-jayz-Z
 2005-08-04 02:54
#37992 #37992
User since
2005-04-13
625 Artikel
BenutzerIn
[Homepage] [default_avatar]
Jo, use strict und use warnings sollte man immer nutzen!
Ich persönlich nutze auch lieber den tcp ping, da man unter Linux root und unter Windows Administrator Rechte benötigt!
Wenn du unter Windows arbeitest, wird dir das vielleicht gar nicht aufgefallen sein.
Du könntest natürlich auch das schreiben, wie du sagtest:
Code: (dl )
1
2
3
4
5
6
7
8
9
 
#!/usr/bin/perl
use strict;
use warnings;

while(1) {
my @ping = qx/ping host.de/;
print for @ping;
}

aber pure Perl ist doch etwas, was ein wahrer Programmierer liber nutzen wird, auch wenn es sons einfacher geht ^^
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="5065726c2d436f6d6d756e697479"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'

http://perl-tutor.de
talpa
 2005-08-03 04:47
#37993 #37993
User since
2005-08-03
3 Artikel
BenutzerIn
[default_avatar]
Hallo,

ich bin Perl-Neuling und benutze ActivePerl unter W2k. Ich versuche die Verfügbarkeit eines Remotehosts über das Net::Ping - Modul zu ermitteln.
Stelle mir das in etwa so vor:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
use Net::Ping;

$remotehost = "ir.gend.was";

while(1){
$p = Net::Ping->new("icmp");
if($p->ping($remotehost,1)) {
print "erreichbar\n";
}
else{
print "nicht erreichbar\n";
}
sleep(30);
$p->close();
}

Wenn das Skript ausgeführt wird, funktioniert es auch so lange bis die Internetverbindung unterbrochen wird. Nachdem die Internetverbindung neu aufgebaut worden ist, schlagen alle weiteren Pings fehl. Erst nach einem Neustart des Skript funktioniert es wieder.

Wäre für jede Info dankbar.

Grüße


edit pq: code-tags hinzugefügt (statt quote-tags)\n\n

<!--EDIT|pq|1123057497-->
talpa
 2005-08-03 14:55
#37994 #37994
User since
2005-08-03
3 Artikel
BenutzerIn
[default_avatar]
Wenn ich esskar richtig verstanden habe, müsste es so aussehen (?):

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
use strict;
use warnings;
use Net::Ping;

my &#36remotehost = "ir.gend.was";

while(1){
    my &#36p = Net::Ping->new("icmp");
    if(&#36p->ping(&#36remotehost,1)) {
        print "erreichbar\n";
    }
    else{
        print "nicht erreichbar\n";
    }
    sleep(30);
    &#36p->close();
}


Leider funktioniert es so nach der Wiederherstellung der Internetverbindung immer noch nicht. Oder habe ich esskars Beitrag falsch interpretiert?
talpa
 2005-08-04 02:28
#37995 #37995
User since
2005-08-03
3 Artikel
BenutzerIn
[default_avatar]
Ok, verstehe. Ich war mir zunaechst nur nicht sicher, ob mich esskars Hinweis direkt zur Problemloesung fuehren sollte.

Mittlerweile vermute ich, nachdem ich die Doku und den Bug-Report u.a. ueber Net-Ping durchschnueffelt habe, dass es an der nicht wasserfesten Implementierung vom ICMP-Protokoll im Net::Ping-Modul liegt. Korrigiert mich, wenn ich da falsch liegen sollte! Mit dem TCP-Protokoll treten die beschriebenen Probleme bei mir nicht auf und das erfuellt meine Wuensche gluecklicherweise auch. Ansonsten haette ich alternativ das "Konsolen-Ping" im Perlskript ausgefuehrt und mir aus der Rueckgabe die gewuenschten Informationen besorgen muessen.

Trotzdem danke fuer alle Hinweise. use strict und use warnings habe ich so jetzt auch kennengelernt.

Nachtrag:
Naja, ich dachte jedenfalls ich hätte die Lösung, aber nachdem ich von Linux wieder auf W2K gewechselt habe und es dort mit ActivePerl 5.6.1 ausprobieren wollte, gab's diese nette Fehlermeldung:
The Unsupported function alarm function is unimplemented at D:/Perl/lib/Net/Ping.pm line 308.
Ist auch schon seit längerem Dokumentiert:
https://rt.cpan.org/NoAuth/Bug.html?id=6408

Jetzt verwende ich das Ping aus der Kommandozeile und es funktioniert einwandfrei auch wenn's nicht die schönste Lösung ist, wie schon bemerkt wurde.\n\n

<!--EDIT|talpa|1123192067-->
Strat
 2005-08-04 13:22
#37996 #37996
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
unter windows geht ping auch als normaler user... unter linux braucht icmp-ping zwar root-rechte, aber die noetigen rechte zum pingen kann man ja auch einem normalen user verschaffen.
der tcp-ping geht, wenn ich mich recht erinnere, auf den echo-port, und der ist nur dann aktiv, wenn man unter windows die einfachen tcp/ip-Dienste installiert und sie nicht durch irgendeine firewall abgeblockt werden...
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
<< >> 7 Einträge, 1 Seite



View all threads created 2005-08-03 10:29.