package Sprocket::Server::UDP; use strict; use warnings; use POE qw( Wheel::UDP Filter::Stackable Filter::Stream ); use Sprocket qw( Server ); use base qw( Sprocket::Server ); sub as_string { __PACKAGE__; } sub _startup { my ( $kernel, $session, $self ) = @_[KERNEL, SESSION, OBJECT]; $session->option( @{$self->{opts}->{server_session_options}} ) if ( $self->{opts}->{server_session_options} ); $kernel->alias_set( $self->{opts}->{server_alias} ) if ( $self->{opts}->{server_alias} ); $kernel->sig( INT => 'signals' ); $self->{name} ||= "Server"; # create a socket factory $self->{wheel} = POE::Wheel::UDP->new( LocalPort => $self->{opts}->{listen_port}, LocalAddr => $self->{opts}->{listen_address}, InputEvent => 'local_receive' ); $self->_log(v => 2, msg => "Listening to port $self->{opts}->{listen_port} on $self->{opts}->{listen_address}"); } sub local_receive { my ( $self, $kernel, $i ) = @_[ OBJECT, KERNEL, ARG1 ]; my $con = $self->new_connection( local_port => $self->{opts}->{listen_port}, local_ip => $self->{opts}->{listen_address}, peer_ip => $peer_ip, peer_hostname => $i->{addr}, peer_port => $i->{port}, peer_addr => "$i->{addr}:$i->{port}", ); $self->process_plugins( [ 'local_receive', $self, $con, $i->{payload} ] ); return; } 1;