NAME
UniEvent::Udp - encapsulate UDP communication for both clients and servers
SYNOPSIS
# client
my $client = UniEvent::Udp->new;
$client->recv_start;
$client->receive_callback(sub {
my ($client, $data, $peer_addr, $flags, $error) = @_;
die("receive data error: $error\n") if $error;
...
});
my $dest = Net::SockAddr::Inet4->new($ip, $port);
$client->send($data, $dest, sub {
my ($client, $error) = @_;
die("sending data error: $error\n") if $error;
...
});
$client->loop->run;
# server
my $server = UniEvent::Udp->new;
$server->bind($host, $port);
$server->recv_start;
$server->receive_callback(sub {
my ($server, $data, $peer_addr, $flags, $error) = @_;
...
say "client ", $peer_addr, " has sent us ", length($data), " bytes";
});
$server->loop->run;
DESCRIPTION
Udp handle allows to send and receive UDP-datagrams, including broadcasting and multicasting capabilities. It is able to work over IPv4 as well as over IPv6 protocols (aka dual stack mode), the difference between them is abstracted from user.
The handle is inherited from UniEvent::Handle.
METHODS
All methods of UniEvent::Handle also apply.
new([$loop = default], [$domain = AF_UNSPEC], [$flags = 0])
Constructs new Udp handle and binds it to the specified event loop.
If $domain or $flags are specified then underlying socket is created immediately and is available via fileno(). Otherwise socket creation is postponed.
The only flag at the moment is UniEvent::Udp::RECVMMSG. See "CONSTANTS" in UniEvent::Udp.
open($fd)
Open an existing file descriptor as Udp handle; it is expected that $sock is valid stream socket.
bind($host, $port, [$hints], [$flags])
Bind the handle to an address, determined by $host, and the specified $port.
The $host can be a domain name, human-readable IP address or special string *, which means "bind to every available network interface on the host".
$port can be 0 in which case handle will be bound to a some available port. It can later be inspected via
say $udp->sockaddr->port;
If $host is a domain name, it is synchronously resolved to address using the specified $hints, see UniEvent::Resolver for the details.
$flags is the bitmask of flags for binding. UE::Udp::IPV6ONLY and UE::Udp::REUSEADDR are supported. See "CONSTANTS" in UniEvent::Udp.
bind_addr($addr, $flags)
Bind the handle to an address. $addr can be either a Net::SockAddr object or perl-style packed address (what sockaddr_in returns). For details on $flags see bind().
connect($sockaddr)
Associate the UDP handle to a remote address and port, so every message sent by this handle is automatically sent to that destination.
Calling this method with an empty addr disconnects the handle.
$sockaddr can be either a Net::SockAddr object or perl-style packed address (what sockaddr_in returns).
connect($host, $port, [$hints])
$host is synchronously resolved to address using the specified $hints and then the above version of connect() is called.
recv_start([$callback])
Instructs to watch for and receive (read) data from the socket. It reads until error condition is met, or until recv_stop.
Receive callback/event will be invoked when new data is received.
If $callback is specified it is added as ->receive_event()->add($callback)
recv_stop()
Stop receiving data from the socket.
receive_callback($sub)
receive_event()
Callbacks set via these methods will be invoked when new data from peer has been received.
Callback signature:
my ($udp, $data, $peer_addr, $flags, $error) = @_;
Where $udp is the udp handle object.
$data is the data has been received.
$peer_addr is the peer address that sent $data as Net::SockAddr object.
$flags is a bitmask of one of "FLAGS" in UniEvent::Udp.
$error is an optional XS::ErrorCode object and if it is present then $data may be undefined.
See "EVENT CALLBACKS" in UniEvent
send($data, $destination, [$callback])
Sends data over the UDP socket to the $destination (which have to be specified in the form of Net::SockAddr or perl-style packed address, what sockaddr_in returns). One-shot $callback will be invoked upon successful operation completion.
You should not specify $destination if handle has been previously connected via connect().
Returns UniEvent::Request::Send object which is an internal purpose object and returned for request tracking purposes only.
send_callback($sub)
send_event()
Callbacks set via these methods will be invoked every time send operation caused by send() method is completed.
Callback signature:
my ($udp, $error, $send_request) = @_;
Where $udp is the udp handle object.
$error is an optional XS::ErrorCode object.
$send_request is an UniEvent::Request::Send object, which is an internal purpose object and passed to callback for request tracking purposes only.
See "EVENT CALLBACKS" in UniEvent
event_listener($delegate, [$weak])
Methods on_receive, on_send will be called.
See "EVENT LISTENER" in UniEvent
sockaddr()
Returns address (as Net::SockAddr object) of the local endpoint.
If socket is not connected/bound, undef is returned.
peeraddr()
Returns address (as Net::SockAddr object) of the remote (peer) endpoint.
if socket is not connected, undef is returned.
set_membership($multicast_addr, $interface_addr, $membership)
Set $membership for a multicast address. The $membership can be either UE::Udp::JOIN_GROUP or UE::Udp::LEAVE_GROUP.
set_source_membership($multicast_addr, $interface_addr, $source_addr, $membership)
Set $membership for a source-specific multicast group. The $membership can be either UE::Udp::JOIN_GROUP or UE::Udp::LEAVE_GROUP.
set_multicast_loop($enabled)
Set IP multicast loop flag. Makes multicast packets loop back to local sockets.
set_multicast_ttl($value)
Set the multicast ttl.
set_multicast_interface()
Set the multicast interface to send or receive data on.
set_broadcast($enabled)
Set broadcast on or off.
set_ttl($value)
Set the time to live.
recv_buffer_size([$value])
Gets or sets the size of the receive buffer that the operating system uses for the socket.
send_buffer_size([$value])
Gets or sets the size of the send buffer that the operating system uses for the socket.
send_queue_size()
Returns the amount of queued bytes waiting to be sent.
CONSTANTS
FLAGS
PARTIAL
Indicates message was truncated because read buffer was too small. The remainder was discarded by the OS.
IPV6ONLY
Disables dual stack mode.
REUSEADDR
Indicates that the message was received by recvmmsg.
RECVMMSG
Indicates that recvmmsg should be used, if available