use IO::Socket; use IO::Interface qw(:flags); sub get_local_addr { my $if = shift; my $s = IO::Socket::INET->new(Proto => 'udp'); unless ($s->if_flags($if) & IFF_RUNNING) { return undef; } else { return $s->if_addr($if); } } #### use Net::Ping; my $addr = get_local_addr("ppp0"); unless(defined $addr) { die "I'm offline\n"; } while (1) { my $p = Net::Ping->new(udp); if $p->ping($host) { print "success\n"; } else { print "failed\n"; my $cur_addr = get_local_addr("ppp0"); if ($addr ne $cur_addr) { die "I'm offline\n"; } } undef $p; sleep 3; }