Socket
use Socket;
my $port = 50001;
my $servaddr = sockaddr_in($port, INADDR_ANY);
my $proto = getprotobyname('udp');
socket(my $sock, AF_INET, SOCK_DGRAM, $proto) or die $!;
bind($sock, $servaddr) or die $!;
my $max_line = 4096;
while(1){
my $cliaddr = recv($sock, my $message, $max_line, 0) or die $!;
(my $mesg = $message) =~ s/\r?\n//;
send($sock, qq{You said:"$mesg"\n}, 0, $cliaddr) or die $!;
}
参照: W. Richard Stevens,1998,UNIX NETWORK PROGRAMMING Volume1 SecondEdition,Prentice Hall,W・リチャード・スティーブンス 篠田 陽一(訳),1999,UNIXネットワークプログラミング第2版 Vol.1,ピアソン・エデュケーション,p.208
Net::Server
package _MyServer;
use parent 'Net::Server';
sub process_request {
my $self = shift;
my $prop = $self->{server};
(my $message = $prop->{udp_data}) =~ s/\r?\n//;
$prop->{client}->send(qq{You said:"$message"\n}, 0);
}
package main;
_MyServer->new->run(port => ":50001/udp");
参照: http://cpansearch.perl.org/src/RHANDOM/Net-Server-2.007/examples/udp_server.pl
IO::Socket::Inet
use IO::Socket::INET;
my $server = IO::Socket::INET->new(
LocalPort => 50001,
Proto => 'udp',
) or die $!;
my $max_line = 4096;
while($server->recv(my $message, $max_line, 0)){
(my $mesg = $message) =~ s/\r?\n//;
$server->send(qq{You said:"$mesg"\n}) or die $!;
}
参照: Tom Christiansen and Nathan Torkington,1998,Perl Cookbook,O'Reilly,トム・クリスチャンセン ネイザン・トーキントン 田和 勝(訳),2001,Perlクックブック,オライリージャパン,p.629
AnyEvent::Handle::UDP
use AnyEvent;
use AnyEvent::Handle::UDP;
my $udp_server = AnyEvent::Handle::UDP->new(
bind => ['0.0.0.0', 50001],
on_recv => sub{
my ($message, $ae_handle, $cliaddr) = @_;
(my $mesg = $message) =~ s/\r?\n//;
$ae_handle->push_send(qq{You said:"$mesg"\n}, $cliaddr);
}
);
my $condvar = AnyEvent->condvar;
$condvar->recv;
参照: http://cpansearch.perl.org/src/LEONT/AnyEvent-Handle-UDP-0.043/examples/anyevent-udp-server.pl