Hi,
You just need to call exit() at some point. This will stop your script
and close your file.
How and when to do that is another matter -- you may want to push the
addresses you ping onto an array, and then pop them off in
client_got_pong(). When the array is empty, exit. Or do the same thing
with a hash -- add a key when pinging, delete it when you get the
response.
I think you may need to tweak the current logic you use with
@addresses. It looks like you shift the entire array in client_start()
but then try again in client_got_pong() -- by that time, however,
@addresses is empty.
You can also, ya know, just do this in client_start:
foreach my $address (@addresses) {
...
}
and avoid the shift'ing and 'last unless defined' check altogether.
Dan
On Thu, 2003-08-28 at 15:28, [EMAIL PROTECTED] wrote:
> I'm having a problem with the script below. It runs through all my addresses
> fine but when it gets to the last one in the array, the program just hangs
> there. My output file is empty so it hasn't been closed yet but if I hit
> CTRL-C, the file is closed and the script stops. I assume I need to somehow
> say my array of addresses is done but how would I do that below? Any help
> would be greatly appreciated.
>
> #!/usr/bin/perl -w
>
> BEGIN {
> die "POE::Component::Client::Ping requires root privilege\n"
> if $> and ( $^O ne 'VMS' );
> }
>
> use POE;
> use POE::Component::Client::Ping;
>
> # How many seconds to wait for ping responses.
> sub PING_TIMEOUT () { 5 }
>
> my $outfile = "/logs/tpaping3.log";
>
> my @addresses = qw(1.1.1.1 2.2.2.2 3.3.3.3 4.4.4.4);
>
> POE::Component::Client::Ping->spawn
> ( Alias => 'pinger',
> Timeout => PING_TIMEOUT,
> OneReply => 1
> );
>
> POE::Session->create
> ( inline_states =>
> { _start => \&client_start,
> pong => \&client_got_pong,
> }
> );
>
> open (OUT_FH, "> $outfile");
> print OUT_FH "Started ".scalar(localtime)."\n";
> $poe_kernel->run();
> close (OUT_FH);
> exit;
>
> sub client_start {
> my ( $kernel, $session ) = @_[ KERNEL, SESSION ];
> print "Starting to ping hosts.\n";
> for (1..20) {
> my $address = shift @addresses;
> last unless defined $address;
> print "Pinging $address at ", scalar(localtime), "\n";
> $kernel->post( pinger => ping => pong => $address );
> }
> }
>
> sub client_got_pong {
> my ( $kernel, $session ) = @_[ KERNEL, SESSION ];
> my $request_packet = $_[ARG0];
> my ( $request_address, $request_timeout, $request_time ) =
> @{$request_packet};
> my $response_packet = $_[ARG1];
> my ( $response_address, $roundtrip_time, $reply_time ) =
> @{$response_packet};
> if (! defined $response_address ) {
> print OUT_FH "Timed out waiting for responses from $request_address.\n";
> }
> my $address = shift @addresses;
> if (defined $address) {
> print "Pinging $address at ".scalar(localtime)."\n";
> $kernel->post( pinger => ping => pong => $address );
> }
> }
>
>