Viewing file: udp_server.pl (2.84 KB) -rwxr-xr-x Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
#!/usr/bin/perl
=head1 NAME
udp_server.pl - Simple sample udp echo server
=head1 SERVER SYNOPSIS
perl udp_server.pl --log_level 3 # default is to not background
=head1 CLIENT SYNOPSIS
# In another terminal
perl udp_server.pl --client
=cut
package MyUDPD; use strict; use warnings; use Data::Dumper;
my $port = 20203; my $host = 'localhost'; my $recv_length = 8192; # packet size
### what type of server is this - we could ### use multi type when we add command line ### parsing to this http server to allow ### for different configurations use base qw(Net::Server::PreFork);
if (grep {/\bclient\b/i} @ARGV) { handle_client();
} else { ### run the server MyUDPD->run( port => "$host:$port/udp", # we could also do the following: # port => '*:20203/udp', # port => 'somehost:20203/udp', # port => '20203/udp', port => '20204/udp', # port => '20203/udp', port => '20203/tcp', ); } exit;
###----------------------------------------------------------------### ### overridden server hooks
### set up some server parameters sub configure_hook { my $self = shift;
### change the packet len? $self->{server}->{udp_recv_len} = $recv_length; # default is 4096
}
### this is the main method to override ### this is where most of the work will occur ### A sample server is shown below. sub process_request { my $self = shift; my $prop = $self->{'server'};
### if we were writing a server that did both tcp and udp, ### we would need to check $prop->{udp_true} to see ### if the current connection is udp or not # if ($prop->{udp_true}) { # # yup, this is udp # }
# all of the client data is already in 'udp_data' if ($prop->{'udp_data'} =~ /dump/) { local $Data::Dumper::Sortkeys = 1; $prop->{'client'}->send(Data::Dumper::Dumper($self), 0); } else { $prop->{'client'}->send("You said \"$prop->{udp_data}\"", 0); } return;
}
###----------------------------------------------------------------### ### dummy client terminal echo relay
sub handle_client { require IO::Socket;
my $recv_flags = 0;
print "$0\nEcho server client relay\nType anything and hit enter\n"; print "-------------------------------\n"; while (defined(my $line = <STDIN>)) { chomp $line;
my $sock = IO::Socket::INET->new( PeerAddr => $host, PeerPort => $port, Proto => 'udp', ) || die "Couldn't connect to $host:$port: $!";
$sock->send($line, 0);
my $data = ''; $sock->recv($data, $recv_length, $recv_flags);
print "From the server:\n$data\n-------------------------\n"; }
}
|