Thread POE UDP Client - Aufruf einer sub (1 answers)
Opened by SoulStyle at 2013-01-26 19:41

SoulStyle
 2013-01-26 19:41
#165203 #165203
User since
2013-01-11
1 Artikel
BenutzerIn
[default_avatar]
Der folgende Code verbindet sich zu einer Server-Anwendung per UDP und holt dessen Statusmeldungen ab:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#!perl

use warnings;
use strict;

use IO::Socket;
use POE qw(Wheel::SocketFactory Wheel::ReadWrite);

my $SERVER_ADDR = '192.168.178.6';
my $SERVER_PORT = '50099';


POE::Session->create(
inline_states => {
_start => sub {
# Start the server.
$_[HEAP]{server} = POE::Wheel::SocketFactory->new(
RemoteAddress => $SERVER_ADDR,
RemotePort => $SERVER_PORT,
SocketProtocol => 'udp',
SuccessEvent => "on_connect",
FailureEvent => "on_server_error",
);
},
on_connect => sub {
# Begin interacting with the server.
my $kernel = $_[KERNEL];
my $client_socket = $_[ARG0];
my $io_wheel = POE::Wheel::ReadWrite->new(
Handle => $client_socket,
InputEvent => "on_receive_data",
ErrorEvent => "on_connect_error",
);
$_[HEAP]{client}{ $io_wheel->ID() } = $io_wheel;

$io_wheel->put( "login monitor monitor", "log on", );
$kernel->yield('keepalive', $io_wheel);
},

on_server_error => sub {
# Shut down server.
my ( $operation, $errnum, $errstr ) = @_[ ARG0, ARG1, ARG2 ];
warn "Server $operation error $errnum: $errstr\n";
delete $_[HEAP]{server};
},
on_receive_data => sub {
# Handle client input.
my ( $kernel, $input, $wheel_id ) = @_[ KERNEL, ARG0, ARG1 ];
print "Received: $input\n";
},
on_connect_error => sub {
# Handle client error, including disconnect.
my $wheel_id = $_[ARG3];
delete $_[HEAP]{client}{$wheel_id};
},
keepalive => sub {
my ( $io_wheel ) = @_[ ARG0 ];
$_[KERNEL]->delay_add( keepalive => 10 );
$io_wheel->put( "keepalive" );
},
}
);

POE::Kernel->run();
exit;

Der Aufruf der "keepalive" sub mittels
$kernel->yield('keepalive', $io_wheel);  funktioniert auch, aber nur ein einziges mal, dann bricht perl mit der Meldung Can't call method "put" on an undefined value at monitor.pl line 59. ab.

Mit diesem Fehler komm ich einfach gerade nicht weiter und dann hätte ich noch eine ganz allgemeine Frage zu POE:

In dem Event-Handle "on_connect" wird die Variable $io_wheel als Handle für ReadWrite definiert. Wie bekomme ich so ein Variable in eine andere sub bzw. wo packt POE sowas hin, dass es von einem beliebigen anderen Code-Teil aufgerufen werden kann?
Last edited: 2013-01-26 19:55:59 +0100 (CET)

View full thread POE UDP Client - Aufruf einer sub