xref: /libuv/docs/src/udp.rst (revision 3e1733a0)
1
2.. _udp:
3
4:c:type:`uv_udp_t` --- UDP handle
5=================================
6
7UDP handles encapsulate UDP communication for both clients and servers.
8
9
10Data types
11----------
12
13.. c:type:: uv_udp_t
14
15    UDP handle type.
16
17.. c:type:: uv_udp_send_t
18
19    UDP send request type.
20
21.. c:enum:: uv_udp_flags
22
23    Flags used in :c:func:`uv_udp_bind` and :c:type:`uv_udp_recv_cb`..
24
25    ::
26
27        enum uv_udp_flags {
28            /* Disables dual stack mode. */
29            UV_UDP_IPV6ONLY = 1,
30            /*
31             * Indicates message was truncated because read buffer was too small. The
32             * remainder was discarded by the OS. Used in uv_udp_recv_cb.
33             */
34            UV_UDP_PARTIAL = 2,
35            /*
36             * Indicates if SO_REUSEADDR will be set when binding the handle.
37             * This sets the SO_REUSEPORT socket flag on the BSDs (except for
38             * DragonFlyBSD), OS X, and other platforms where SO_REUSEPORTs don't
39             * have the capability of load balancing, as the opposite of what
40             * UV_UDP_REUSEPORT would do. On other Unix platforms, it sets the
41             * SO_REUSEADDR flag. What that means is that multiple threads or
42             * processes can bind to the same address without error (provided
43             * they all set the flag) but only the last one to bind will receive
44             * any traffic, in effect "stealing" the port from the previous listener.
45             */
46            UV_UDP_REUSEADDR = 4,
47            /*
48             * Indicates that the message was received by recvmmsg, so the buffer provided
49             * must not be freed by the recv_cb callback.
50             */
51            UV_UDP_MMSG_CHUNK = 8,
52            /*
53             * Indicates that the buffer provided has been fully utilized by recvmmsg and
54             * that it should now be freed by the recv_cb callback. When this flag is set
55             * in uv_udp_recv_cb, nread will always be 0 and addr will always be NULL.
56             */
57            UV_UDP_MMSG_FREE = 16,
58            /*
59             * Indicates if IP_RECVERR/IPV6_RECVERR will be set when binding the handle.
60             * This sets IP_RECVERR for IPv4 and IPV6_RECVERR for IPv6 UDP sockets on
61             * Linux. This stops the Linux kernel from suppressing some ICMP error messages
62             * and enables full ICMP error reporting for faster failover.
63             * This flag is no-op on platforms other than Linux.
64             */
65            UV_UDP_LINUX_RECVERR = 32,
66            /*
67             * Indicates if SO_REUSEPORT will be set when binding the handle.
68             * This sets the SO_REUSEPORT socket option on supported platforms.
69             * Unlike UV_UDP_REUSEADDR, this flag will make multiple threads or
70             * processes that are binding to the same address and port "share"
71             * the port, which means incoming datagrams are distributed across
72             * the receiving sockets among threads or processes.
73             *
74             * This flag is available only on Linux 3.9+, DragonFlyBSD 3.6+,
75             * FreeBSD 12.0+, Solaris 11.4, and AIX 7.2.5+ for now.
76             */
77            UV_UDP_REUSEPORT = 64,
78            /*
79             * Indicates that recvmmsg should be used, if available.
80             */
81            UV_UDP_RECVMMSG = 256
82        };
83
84.. c:type:: void (*uv_udp_send_cb)(uv_udp_send_t* req, int status)
85
86    Type definition for callback passed to :c:func:`uv_udp_send`, which is
87    called after the data was sent.
88
89.. c:type:: void (*uv_udp_recv_cb)(uv_udp_t* handle, ssize_t nread, const uv_buf_t* buf, const struct sockaddr* addr, unsigned flags)
90
91    Type definition for callback passed to :c:func:`uv_udp_recv_start`, which
92    is called when the endpoint receives data.
93
94    * `handle`: UDP handle
95    * `nread`:  Number of bytes that have been received.
96      0 if there is no more data to read. Note that 0 may also mean that an
97      empty datagram was received (in this case `addr` is not NULL). < 0 if
98      a transmission error was detected; if using :man:`recvmmsg(2)` no more
99      chunks will be received and the buffer can be freed safely.
100    * `buf`: :c:type:`uv_buf_t` with the received data.
101    * `addr`: ``struct sockaddr*`` containing the address of the sender.
102      Can be NULL. Valid for the duration of the callback only.
103    * `flags`: One or more or'ed UV_UDP_* constants.
104
105    The callee is responsible for freeing the buffer, libuv does not reuse it.
106    The buffer may be a null buffer (where `buf->base` == NULL and `buf->len` == 0)
107    on error.
108
109    When using :man:`recvmmsg(2)`, chunks will have the `UV_UDP_MMSG_CHUNK` flag set,
110    those must not be freed. If no errors occur, there will be a final callback with
111    `nread` set to 0, `addr` set to NULL and the buffer pointing at the initially
112    allocated data with the `UV_UDP_MMSG_CHUNK` flag cleared and the `UV_UDP_MMSG_FREE`
113    flag set. If a UDP socket error occurs, `nread` will be < 0. In either scenario,
114    the callee can now safely free the provided buffer.
115
116    .. versionchanged:: 1.40.0 added the `UV_UDP_MMSG_FREE` flag.
117
118    .. note::
119        The receive callback will be called with `nread` == 0 and `addr` == NULL when there is
120        nothing to read, and with `nread` == 0 and `addr` != NULL when an empty UDP packet is
121        received.
122
123.. c:enum:: uv_membership
124
125    Membership type for a multicast address.
126
127    ::
128
129        typedef enum {
130            UV_LEAVE_GROUP = 0,
131            UV_JOIN_GROUP
132        } uv_membership;
133
134
135Public members
136^^^^^^^^^^^^^^
137
138.. c:member:: size_t uv_udp_t.send_queue_size
139
140    Number of bytes queued for sending. This field strictly shows how much
141    information is currently queued.
142
143.. c:member:: size_t uv_udp_t.send_queue_count
144
145    Number of send requests currently in the queue awaiting to be processed.
146
147.. c:member:: uv_udp_t* uv_udp_send_t.handle
148
149    UDP handle where this send request is taking place.
150
151.. seealso:: The :c:type:`uv_handle_t` members also apply.
152
153
154API
155---
156
157.. c:function:: int uv_udp_init(uv_loop_t* loop, uv_udp_t* handle)
158
159    Initialize a new UDP handle. The actual socket is created lazily.
160    Returns 0 on success.
161
162.. c:function:: int uv_udp_init_ex(uv_loop_t* loop, uv_udp_t* handle, unsigned int flags)
163
164    Initialize the handle with the specified flags. The lower 8 bits of the `flags`
165    parameter are used as the socket domain. A socket will be created for the given domain.
166    If the specified domain is ``AF_UNSPEC`` no socket is created, just like :c:func:`uv_udp_init`.
167
168    The remaining bits can be used to set one of these flags:
169
170    * `UV_UDP_RECVMMSG`: if set, and the platform supports it, :man:`recvmmsg(2)` will
171      be used.
172
173    .. versionadded:: 1.7.0
174    .. versionchanged:: 1.37.0 added the `UV_UDP_RECVMMSG` flag.
175
176.. c:function:: int uv_udp_open(uv_udp_t* handle, uv_os_sock_t sock)
177
178    Opens an existing file descriptor or Windows SOCKET as a UDP handle.
179
180    Unix only:
181    The only requirement of the `sock` argument is that it follows the datagram
182    contract (works in unconnected mode, supports sendmsg()/recvmsg(), etc).
183    In other words, other datagram-type sockets like raw sockets or netlink
184    sockets can also be passed to this function.
185
186    .. versionchanged:: 1.2.1 the file descriptor is set to non-blocking mode.
187
188    .. note::
189        The passed file descriptor or SOCKET is not checked for its type, but
190        it's required that it represents a valid datagram socket.
191
192.. c:function:: int uv_udp_bind(uv_udp_t* handle, const struct sockaddr* addr, unsigned int flags)
193
194    Bind the UDP handle to an IP address and port.
195
196    :param handle: UDP handle. Should have been initialized with
197        :c:func:`uv_udp_init`.
198
199    :param addr: `struct sockaddr_in` or `struct sockaddr_in6`
200        with the address and port to bind to.
201
202    :param flags: Indicate how the socket will be bound,
203        ``UV_UDP_IPV6ONLY``, ``UV_UDP_REUSEADDR``, ``UV_UDP_REUSEPORT``,
204        and ``UV_UDP_RECVERR`` are supported.
205
206    :returns: 0 on success, or an error code < 0 on failure.
207
208    .. versionchanged:: 1.49.0 added the ``UV_UDP_REUSEPORT`` flag.
209
210    .. note::
211        ``UV_UDP_REUSEPORT`` flag is available only on Linux 3.9+, DragonFlyBSD 3.6+,
212        FreeBSD 12.0+, Solaris 11.4, and AIX 7.2.5+ at the moment. On other platforms
213        this function will return an UV_ENOTSUP error.
214        For platforms where `SO_REUSEPORT`s have the capability of load balancing,
215        specifying both ``UV_UDP_REUSEADDR`` and ``UV_UDP_REUSEPORT`` in flags is allowed
216        and `SO_REUSEPORT` will always override the behavior of `SO_REUSEADDR`.
217        For platforms where `SO_REUSEPORT`s don't have the capability of load balancing,
218        specifying both ``UV_UDP_REUSEADDR`` and ``UV_UDP_REUSEPORT`` in flags will fail,
219        returning an UV_ENOTSUP error.
220
221.. c:function:: int uv_udp_connect(uv_udp_t* handle, const struct sockaddr* addr)
222
223    Associate the UDP handle to a remote address and port, so every
224    message sent by this handle is automatically sent to that destination.
225    Calling this function with a `NULL` `addr` disconnects the handle.
226    Trying to call `uv_udp_connect()` on an already connected handle will result
227    in an `UV_EISCONN` error. Trying to disconnect a handle that is not
228    connected will return an `UV_ENOTCONN` error.
229
230    :param handle: UDP handle. Should have been initialized with
231        :c:func:`uv_udp_init`.
232
233    :param addr: `struct sockaddr_in` or `struct sockaddr_in6`
234        with the address and port to associate to.
235
236    :returns: 0 on success, or an error code < 0 on failure.
237
238    .. versionadded:: 1.27.0
239
240.. c:function:: int uv_udp_getpeername(const uv_udp_t* handle, struct sockaddr* name, int* namelen)
241
242    Get the remote IP and port of the UDP handle on connected UDP handles.
243    On unconnected handles, it returns `UV_ENOTCONN`.
244
245    :param handle: UDP handle. Should have been initialized with
246        :c:func:`uv_udp_init` and bound.
247
248    :param name: Pointer to the structure to be filled with the address data.
249        In order to support IPv4 and IPv6 `struct sockaddr_storage` should be
250        used.
251
252    :param namelen: On input it indicates the data of the `name` field. On
253        output it indicates how much of it was filled.
254
255    :returns: 0 on success, or an error code < 0 on failure
256
257    .. versionadded:: 1.27.0
258
259.. c:function:: int uv_udp_getsockname(const uv_udp_t* handle, struct sockaddr* name, int* namelen)
260
261    Get the local IP and port of the UDP handle.
262
263    :param handle: UDP handle. Should have been initialized with
264        :c:func:`uv_udp_init` and bound.
265
266    :param name: Pointer to the structure to be filled with the address data.
267        In order to support IPv4 and IPv6 `struct sockaddr_storage` should be
268        used.
269
270    :param namelen: On input it indicates the data of the `name` field. On
271        output it indicates how much of it was filled.
272
273    :returns: 0 on success, or an error code < 0 on failure.
274
275.. c:function:: int uv_udp_set_membership(uv_udp_t* handle, const char* multicast_addr, const char* interface_addr, uv_membership membership)
276
277    Set membership for a multicast address
278
279    :param handle: UDP handle. Should have been initialized with
280        :c:func:`uv_udp_init`.
281
282    :param multicast_addr: Multicast address to set membership for.
283
284    :param interface_addr: Interface address.
285
286    :param membership: Should be ``UV_JOIN_GROUP`` or ``UV_LEAVE_GROUP``.
287
288    :returns: 0 on success, or an error code < 0 on failure.
289
290.. c:function:: int uv_udp_set_source_membership(uv_udp_t* handle, const char* multicast_addr, const char* interface_addr, const char* source_addr, uv_membership membership)
291
292    Set membership for a source-specific multicast group.
293
294    :param handle: UDP handle. Should have been initialized with
295        :c:func:`uv_udp_init`.
296
297    :param multicast_addr: Multicast address to set membership for.
298
299    :param interface_addr: Interface address.
300
301    :param source_addr: Source address.
302
303    :param membership: Should be ``UV_JOIN_GROUP`` or ``UV_LEAVE_GROUP``.
304
305    :returns: 0 on success, or an error code < 0 on failure.
306
307    .. versionadded:: 1.32.0
308
309.. c:function:: int uv_udp_set_multicast_loop(uv_udp_t* handle, int on)
310
311    Set IP multicast loop flag. Makes multicast packets loop back to
312    local sockets.
313
314    :param handle: UDP handle. Should have been initialized with
315        :c:func:`uv_udp_init_ex` as either ``AF_INET`` or ``AF_INET6``, or have
316        been bound to an address explicitly with :c:func:`uv_udp_bind`, or
317        implicitly with :c:func:`uv_udp_send()` or :c:func:`uv_udp_recv_start`.
318
319    :param on: 1 for on, 0 for off.
320
321    :returns: 0 on success, or an error code < 0 on failure.
322
323.. c:function:: int uv_udp_set_multicast_ttl(uv_udp_t* handle, int ttl)
324
325    Set the multicast ttl.
326
327    :param handle: UDP handle. Should have been initialized with
328        :c:func:`uv_udp_init_ex` as either ``AF_INET`` or ``AF_INET6``, or have
329        been bound to an address explicitly with :c:func:`uv_udp_bind`, or
330        implicitly with :c:func:`uv_udp_send()` or :c:func:`uv_udp_recv_start`.
331
332    :param ttl: 1 through 255.
333
334    :returns: 0 on success, or an error code < 0 on failure.
335
336.. c:function:: int uv_udp_set_multicast_interface(uv_udp_t* handle, const char* interface_addr)
337
338    Set the multicast interface to send or receive data on.
339
340    :param handle: UDP handle. Should have been initialized with
341        :c:func:`uv_udp_init_ex` as either ``AF_INET`` or ``AF_INET6``, or have
342        been bound to an address explicitly with :c:func:`uv_udp_bind`, or
343        implicitly with :c:func:`uv_udp_send()` or :c:func:`uv_udp_recv_start`.
344
345    :param interface_addr: interface address.
346
347    :returns: 0 on success, or an error code < 0 on failure.
348
349.. c:function:: int uv_udp_set_broadcast(uv_udp_t* handle, int on)
350
351    Set broadcast on or off.
352
353    :param handle: UDP handle. Should have been initialized with
354        :c:func:`uv_udp_init_ex` as either ``AF_INET`` or ``AF_INET6``, or have
355        been bound to an address explicitly with :c:func:`uv_udp_bind`, or
356        implicitly with :c:func:`uv_udp_send()` or :c:func:`uv_udp_recv_start`.
357
358    :param on: 1 for on, 0 for off.
359
360    :returns: 0 on success, or an error code < 0 on failure.
361
362.. c:function:: int uv_udp_set_ttl(uv_udp_t* handle, int ttl)
363
364    Set the time to live.
365
366    :param handle: UDP handle. Should have been initialized with
367        :c:func:`uv_udp_init_ex` as either ``AF_INET`` or ``AF_INET6``, or have
368        been bound to an address explicitly with :c:func:`uv_udp_bind`, or
369        implicitly with :c:func:`uv_udp_send()` or :c:func:`uv_udp_recv_start`.
370
371    :param ttl: 1 through 255.
372
373    :returns: 0 on success, or an error code < 0 on failure.
374
375.. c:function:: int uv_udp_send(uv_udp_send_t* req, uv_udp_t* handle, const uv_buf_t bufs[], unsigned int nbufs, const struct sockaddr* addr, uv_udp_send_cb send_cb)
376
377    Send data over the UDP socket. If the socket has not previously been bound
378    with :c:func:`uv_udp_bind` it will be bound to 0.0.0.0
379    (the "all interfaces" IPv4 address) and a random port number.
380
381    On Windows if the `addr` is initialized to point to an unspecified address
382    (``0.0.0.0`` or ``::``) it will be changed to point to ``localhost``.
383    This is done to match the behavior of Linux systems.
384
385    For connected UDP handles, `addr` must be set to `NULL`, otherwise it will
386    return `UV_EISCONN` error.
387
388    For connectionless UDP handles, `addr` cannot be `NULL`, otherwise it will
389    return `UV_EDESTADDRREQ` error.
390
391    :param req: UDP request handle. Need not be initialized.
392
393    :param handle: UDP handle. Should have been initialized with
394        :c:func:`uv_udp_init`.
395
396    :param bufs: List of buffers to send.
397
398    :param nbufs: Number of buffers in `bufs`.
399
400    :param addr: `struct sockaddr_in` or `struct sockaddr_in6` with the
401        address and port of the remote peer.
402
403    :param send_cb: Callback to invoke when the data has been sent out.
404
405    :returns: 0 on success, or an error code < 0 on failure.
406
407    .. versionchanged:: 1.19.0 added ``0.0.0.0`` and ``::`` to ``localhost``
408        mapping
409
410    .. versionchanged:: 1.27.0 added support for connected sockets
411
412.. c:function:: int uv_udp_try_send(uv_udp_t* handle, const uv_buf_t bufs[], unsigned int nbufs, const struct sockaddr* addr)
413
414    Same as :c:func:`uv_udp_send`, but won't queue a send request if it can't
415    be completed immediately.
416
417    For connected UDP handles, `addr` must be set to `NULL`, otherwise it will
418    return `UV_EISCONN` error.
419
420    For connectionless UDP handles, `addr` cannot be `NULL`, otherwise it will
421    return `UV_EDESTADDRREQ` error.
422
423    :returns: >= 0: number of bytes sent (it matches the given buffer size).
424        < 0: negative error code (``UV_EAGAIN`` is returned when the message
425        can't be sent immediately).
426
427    .. versionchanged:: 1.27.0 added support for connected sockets
428
429.. c:function:: int uv_udp_recv_start(uv_udp_t* handle, uv_alloc_cb alloc_cb, uv_udp_recv_cb recv_cb)
430
431    Prepare for receiving data. If the socket has not previously been bound
432    with :c:func:`uv_udp_bind` it is bound to 0.0.0.0 (the "all interfaces"
433    IPv4 address) and a random port number.
434
435    :param handle: UDP handle. Should have been initialized with
436        :c:func:`uv_udp_init`.
437
438    :param alloc_cb: Callback to invoke when temporary storage is needed.
439
440    :param recv_cb: Callback to invoke with received data.
441
442    :returns: 0 on success, or an error code < 0 on failure.
443
444    .. note::
445        When using :man:`recvmmsg(2)`, the number of messages received at a time is limited
446        by the number of max size dgrams that will fit into the buffer allocated in `alloc_cb`, and
447        `suggested_size` in `alloc_cb` for udp_recv is always set to the size of 1 max size dgram.
448
449    .. versionchanged:: 1.35.0 added support for :man:`recvmmsg(2)` on supported platforms).
450                        The use of this feature requires a buffer larger than
451                        2 * 64KB to be passed to `alloc_cb`.
452    .. versionchanged:: 1.37.0 :man:`recvmmsg(2)` support is no longer enabled implicitly,
453                        it must be explicitly requested by passing the `UV_UDP_RECVMMSG` flag to
454                        :c:func:`uv_udp_init_ex`.
455    .. versionchanged:: 1.39.0 :c:func:`uv_udp_using_recvmmsg` can be used in `alloc_cb` to
456                        determine if a buffer sized for use with :man:`recvmmsg(2)` should be
457                        allocated for the current handle/platform.
458
459.. c:function:: int uv_udp_using_recvmmsg(uv_udp_t* handle)
460
461    Returns 1 if the UDP handle was created with the `UV_UDP_RECVMMSG` flag
462    and the platform supports :man:`recvmmsg(2)`, 0 otherwise.
463
464    .. versionadded:: 1.39.0
465
466.. c:function:: int uv_udp_recv_stop(uv_udp_t* handle)
467
468    Stop listening for incoming datagrams.
469
470    :param handle: UDP handle. Should have been initialized with
471        :c:func:`uv_udp_init`.
472
473    :returns: 0 on success, or an error code < 0 on failure.
474
475.. c:function:: size_t uv_udp_get_send_queue_size(const uv_udp_t* handle)
476
477    Returns `handle->send_queue_size`.
478
479    .. versionadded:: 1.19.0
480
481.. c:function:: size_t uv_udp_get_send_queue_count(const uv_udp_t* handle)
482
483    Returns `handle->send_queue_count`.
484
485    .. versionadded:: 1.19.0
486
487.. seealso:: The :c:type:`uv_handle_t` API functions also apply.
488