Tells the kernel to join a multicast group at the given multicastAddress and
multicastInterface using the IP_ADD_MEMBERSHIP socket option. If the
multicastInterface argument is not specified, the operating system will choose
one interface and will add membership to it. To add membership to every
available interface, call addMembership multiple times, once per interface.

When sharing a UDP socket across multiple cluster workers, the
socket.addMembership() function must be called only once or an
EADDRINUSE error will occur:

callback<Function> with no parameters. Called when binding is complete.

For UDP sockets, causes the dgram.Socket to listen for datagram
messages on a named port and optional address. If port is not
specified or is 0, the operating system will attempt to bind to a
random port. If address is not specified, the operating system will
attempt to listen on all addresses. Once binding is complete, a
'listening' event is emitted and the optional callback function is
called.

Note that specifying both a 'listening' event listener and passing a
callback to the socket.bind() method is not harmful but not very
useful.

For UDP sockets, causes the dgram.Socket to listen for datagram
messages on a named port and optional address that are passed as
properties of an options object passed as the first argument. If
port is not specified or is 0, the operating system will attempt
to bind to a random port. If address is not specified, the operating
system will attempt to listen on all addresses. Once binding is
complete, a 'listening' event is emitted and the optional callback
function is called.

The options object may contain a fd property. When a fd greater
than 0 is set, it will wrap around an existing socket with the given
file descriptor. In this case, the properties of port and address
will be ignored.

Note that specifying both a 'listening' event listener and passing a
callback to the socket.bind() method is not harmful but not very
useful.

The options object may contain an additional exclusive property that is
use when using dgram.Socket objects with the cluster module. When
exclusive is set to false (the default), cluster workers will use the same
underlying socket handle allowing connection handling duties to be shared.
When exclusive is true, however, the handle is not shared and attempted
port sharing results in an error.

Instructs the kernel to leave a multicast group at multicastAddress using the
IP_DROP_MEMBERSHIP socket option. This method is automatically called by the
kernel when the socket is closed or the process terminates, so most apps will
never have reason to call this.

If multicastInterface is not specified, the operating system will attempt to
drop membership on all valid interfaces.

By default, binding a socket will cause it to block the Node.js process from
exiting as long as the socket is open. The socket.unref() method can be used
to exclude the socket from the reference counting that keeps the Node.js
process active. The socket.ref() method adds the socket back to the reference
counting and restores the default behavior.

Calling socket.ref() multiples times will have no additional effect.

The socket.ref() method returns a reference to the socket so calls can be
chained.

Broadcasts a datagram on the socket. The destination port and address must
be specified.

The msg argument contains the message to be sent.
Depending on its type, different behavior can apply. If msg is a Buffer
or Uint8Array,
the offset and length specify the offset within the Buffer where the
message begins and the number of bytes in the message, respectively.
If msg is a String, then it is automatically converted to a Buffer
with 'utf8' encoding. With messages that
contain multi-byte characters, offset and length will be calculated with
respect to byte length and not the character position.
If msg is an array, offset and length must not be specified.

The address argument is a string. If the value of address is a host name,
DNS will be used to resolve the address of the host. If address is not
provided or otherwise falsy, '127.0.0.1' (for udp4 sockets) or '::1'
(for udp6 sockets) will be used by default.

If the socket has not been previously bound with a call to bind, the socket
is assigned a random port number and is bound to the "all interfaces" address
('0.0.0.0' for udp4 sockets, '::0' for udp6 sockets.)

An optional callback function may be specified to as a way of reporting
DNS errors or for determining when it is safe to reuse the buf object.
Note that DNS lookups delay the time to send for at least one tick of the
Node.js event loop.

The only way to know for sure that the datagram has been sent is by using a
callback. If an error occurs and a callback is given, the error will be
passed as the first argument to the callback. If a callback is not given,
the error is emitted as an 'error' event on the socket object.

Offset and length are optional but both must be set if either are used.
They are supported only when the first argument is a Buffer or Uint8Array.

Sending multiple buffers might be faster or slower depending on the
application and operating system. It is important to run benchmarks to
determine the optimal strategy on a case-by-case basis. Generally speaking,
however, sending multiple buffers is faster.

A Note about UDP datagram size

The maximum size of an IPv4/v6 datagram depends on the MTU
(Maximum Transmission Unit) and on the Payload Length field size.

The Payload Length field is 16 bits wide, which means that a normal
payload exceed 64K octets including the internet header and data
(65,507 bytes = 65,535 − 8 bytes UDP header − 20 bytes IP header);
this is generally true for loopback interfaces, but such long datagram
messages are impractical for most hosts and networks.

The MTU is the largest size a given link layer technology can support for
datagram messages. For any link, IPv4 mandates a minimum MTU of 68
octets, while the recommended MTU for IPv4 is 576 (typically recommended
as the MTU for dial-up type applications), whether they arrive whole or in
fragments.

For IPv6, the minimum MTU is 1280 octets, however, the mandatory minimum
fragment reassembly buffer size is 1500 octets. The value of 68 octets is
very small, since most current link layer technologies, like Ethernet, have a
minimum MTU of 1500.

It is impossible to know in advance the MTU of each link through which
a packet might travel. Sending a datagram greater than the receiver MTU will
not work because the packet will get silently dropped without informing the
source that the data did not reach its intended recipient.

All references to scope in this section are referring to
IPv6 Zone Indices, which are defined by RFC 4007. In string form, an IP
with a scope index is written as 'IP%scope' where scope is an interface name
or interface number.

Sets the default outgoing multicast interface of the socket to a chosen
interface or back to system interface selection. The multicastInterface must
be a valid string representation of an IP from the socket's family.

For IPv4 sockets, this should be the IP configured for the desired physical
interface. All packets sent to multicast on the socket will be sent on the
interface determined by the most recent successful use of this call.

For IPv6 sockets, multicastInterface should include a scope to indicate the
interface as in the examples that follow. In IPv6, individual send calls can
also use explicit scope in addresses, so only packets sent to a multicast
address without specifying an explicit scope are affected by the most recent
successful use of this call.

Sets the IP_MULTICAST_TTL socket option. While TTL generally stands for
"Time to Live", in this context it specifies the number of IP hops that a
packet is allowed to travel through, specifically for multicast traffic. Each
router or gateway that forwards a packet decrements the TTL. If the TTL is
decremented to 0 by a router, it will not be forwarded.

The argument passed to socket.setMulticastTTL() is a number of hops
between 0 and 255. The default on most systems is 1 but can vary.

Sets the IP_TTL socket option. While TTL generally stands for "Time to Live",
in this context it specifies the number of IP hops that a packet is allowed to
travel through. Each router or gateway that forwards a packet decrements the
TTL. If the TTL is decremented to 0 by a router, it will not be forwarded.
Changing TTL values is typically done for network probes or when multicasting.

The argument to socket.setTTL() is a number of hops between 1 and 255.
The default on most systems is 64 but can vary.

By default, binding a socket will cause it to block the Node.js process from
exiting as long as the socket is open. The socket.unref() method can be used
to exclude the socket from the reference counting that keeps the Node.js
process active, allowing the process to exit even if the socket is still
listening.

Calling socket.unref() multiple times will have no addition effect.

The socket.unref() method returns a reference to the socket so calls can be
chained.

Creates a dgram.Socket object. Once the socket is created, calling
socket.bind() will instruct the socket to begin listening for datagram
messages. When address and port are not passed to socket.bind() the
method will bind the socket to the "all interfaces" address on a random port
(it does the right thing for both udp4 and udp6 sockets). The bound address
and port can be retrieved using socket.address().address and
socket.address().port.

Creates a dgram.Socket object of the specified type. The type argument
can be either 'udp4' or 'udp6'. An optional callback function can be
passed which is added as a listener for 'message' events.

Once the socket is created, calling socket.bind() will instruct the
socket to begin listening for datagram messages. When address and port are
not passed to socket.bind() the method will bind the socket to the "all
interfaces" address on a random port (it does the right thing for both udp4
and udp6 sockets). The bound address and port can be retrieved using
socket.address().address and socket.address().port.