Sock submodule for UDP.
More...
Sock submodule for UDP.
How To Use
First you need to include a module that implements this API in your application's Makefile. For example the implementation for GNRC is called gnrc_sock_udp
.
A Simple UDP Echo Server
uint8_t buf[128];
int main(void)
{
puts("Error creating UDP sock");
return 1;
}
while (1) {
ssize_t res;
&remote)) >= 0) {
puts("Received a message");
puts("Error sending reply");
}
}
}
return 0;
}
int sock_udp_create(sock_udp_t *sock, const sock_udp_ep_t *local, const sock_udp_ep_t *remote, uint16_t flags)
Creates a new UDP sock object.
static ssize_t sock_udp_send(sock_udp_t *sock, const void *data, size_t len, const sock_udp_ep_t *remote)
Sends a UDP message to remote end point.
static ssize_t sock_udp_recv(sock_udp_t *sock, void *data, size_t max_len, uint32_t timeout, sock_udp_ep_t *remote)
Receives a UDP message from a remote end point.
#define SOCK_IPV6_EP_ANY
Address to bind to any IPv6 address.
#define SOCK_NO_TIMEOUT
Special value meaning "wait forever" (don't timeout)
stdio wrapper to extend the C libs stdio
Common IP-based transport layer end point.
uint16_t port
transport layer port (in host byte order)
Above you see a simple UDP echo server. Don't forget to also include the IPv6 module of your networking implementation (e.g. gnrc_ipv6_default
for Generic (GNRC) network stack GNRC) and at least one network device.
After including the header file for UDP sock, we create some buffer space buf
to store the data received by the server:
To be able to listen for incoming packets we bind the sock
by setting a local end point with a port (12345
in this case).
We then proceed to create the sock
. It is bound to local
and thus listens for UDP packets with destination port 12345
. Since we don't need any further configuration we set the flags to 0. In case of an error we stop the program:
puts("Error creating UDP sock");
return 1;
}
The application then waits indefinitely for an incoming message in buf
from remote
. If we want to timeout this wait period we could alternatively set the timeout
parameter of sock_udp_recv() to a value != SOCK_NO_TIMEOUT. If an error occurs on receive we just ignore it and continue looping.
If we receive a message we use its remote
to reply. In case of an error on send we print an according message:
while (1) {
ssize_t res;
&remote)) >= 0) {
puts("Received a message");
puts("Error sending reply");
}
}
}
A Simple UDP Echo Client
There are two kinds of clients. Those that do expect a reply and those who don't. A client that does not require a reply is very simple to implement in one line:
With data
being the data sent, data_len
the length of data
and remote
the remote end point the packet that is is to be sent.
To see some other capabilities we look at a more complex example in form of the counter of the echo server above:
uint8_t buf[7];
int main(void)
{
puts("Error creating UDP sock");
return 1;
}
while (1) {
ssize_t res;
if (
sock_udp_send(&sock,
"Hello!",
sizeof(
"Hello!"), &remote) < 0) {
puts("Error sending message");
return 1;
}
NULL)) < 0) {
puts("Timed out");
}
else {
puts("Error receiving message");
}
}
else {
printf(
"Received message: \"");
for (int i = 0; i < res; i++) {
}
}
}
return 0;
}
Global UNIX address family definitions.
#define AF_INET6
internetwork address family with IPv6: UDP, TCP, etc.
#define ETIMEDOUT
Connection timed out.
#define printf(...)
A wrapper for the printf() function that passes arguments through unmodified, but fails to compile if...
#define IPV6_ADDR_MCAST_SCP_LINK_LOCAL
link-local scope
static void ipv6_addr_set_all_nodes_multicast(ipv6_addr_t *addr, unsigned int scope)
Sets addr dynamically to an all nodes multicast IPv6 address (ff0S::1, where S is the scope).
void sock_udp_close(sock_udp_t *sock)
Closes a UDP sock object.
#define US_PER_SEC
The number of microseconds per second.
static void xtimer_sleep(uint32_t seconds)
Pause the execution of a thread for some seconds.
Definitions for IPv6 addresses.
Protocol number definitions.
union _sock_tl_ep::@384 addr
address
int family
family of sock_ip_ep_t::addr
uint8_t ipv6[16]
IPv6 address mode.
Data type to represent an IPv6 address.
xtimer interface definitions
Again: Don't forget to also include the IPv6 module of your networking implementation (e.g. gnrc_ipv6_default
for GNRC) and at least one network device.
We first create again a sock
with a local end point bound to any IPv6 address and some port. Note that we also could specify the remote here and not use it with sock_udp_send().
puts("Error creating UDP sock");
return 1;
}
We then create a remote end point with the link-local all nodes multicast address (ff02::1
) and port 12345
and send a "Hello!" message to that end point.
ssize_t res;
if (
sock_udp_send(&sock,
"Hello!",
sizeof(
"Hello!"), &remote) < 0) {
puts("Error sending message");
return 1;
}
We then wait a second for a reply and print it when it is received.
NULL)) < 0) {
puts("Timed out");
}
else {
puts("Error receiving message");
}
}
else {
printf(
"Received message: \"");
for (int i = 0; i < res; i++) {
}
}
Finally, we wait a second before sending out the next "Hello!" with xtimer_sleep(1)
.
|
file | udp.h |
| UDP sock definitions.
|
|
|
int | sock_udp_create (sock_udp_t *sock, const sock_udp_ep_t *local, const sock_udp_ep_t *remote, uint16_t flags) |
| Creates a new UDP sock object.
|
|
void | sock_udp_close (sock_udp_t *sock) |
| Closes a UDP sock object.
|
|
int | sock_udp_get_local (sock_udp_t *sock, sock_udp_ep_t *ep) |
| Gets the local end point of a UDP sock object.
|
|
int | sock_udp_get_remote (sock_udp_t *sock, sock_udp_ep_t *ep) |
| Gets the remote end point of a UDP sock object.
|
|
ssize_t | sock_udp_recv_aux (sock_udp_t *sock, void *data, size_t max_len, uint32_t timeout, sock_udp_ep_t *remote, sock_udp_aux_rx_t *aux) |
| Receives a UDP message from a remote end point.
|
|
static ssize_t | sock_udp_recv (sock_udp_t *sock, void *data, size_t max_len, uint32_t timeout, sock_udp_ep_t *remote) |
| Receives a UDP message from a remote end point.
|
|
ssize_t | sock_udp_recv_buf_aux (sock_udp_t *sock, void **data, void **buf_ctx, uint32_t timeout, sock_udp_ep_t *remote, sock_udp_aux_rx_t *aux) |
| Provides stack-internal buffer space containing a UDP message from a remote end point.
|
|
static ssize_t | sock_udp_recv_buf (sock_udp_t *sock, void **data, void **buf_ctx, uint32_t timeout, sock_udp_ep_t *remote) |
| Provides stack-internal buffer space containing a UDP message from a remote end point.
|
|
ssize_t | sock_udp_sendv_aux (sock_udp_t *sock, const iolist_t *snips, const sock_udp_ep_t *remote, sock_udp_aux_tx_t *aux) |
| Sends a UDP message to remote end point with non-continous payload.
|
|
static ssize_t | sock_udp_send_aux (sock_udp_t *sock, const void *data, size_t len, const sock_udp_ep_t *remote, sock_udp_aux_tx_t *aux) |
| Sends a UDP message to remote end point.
|
|
static ssize_t | sock_udp_send (sock_udp_t *sock, const void *data, size_t len, const sock_udp_ep_t *remote) |
| Sends a UDP message to remote end point.
|
|
static ssize_t | sock_udp_sendv (sock_udp_t *sock, const iolist_t *snips, const sock_udp_ep_t *remote) |
| Sends a UDP message to remote end point with non-continous payload.
|
|
static bool | sock_udp_ep_is_multicast (const sock_udp_ep_t *ep) |
| Checks if the IP address of an endpoint is multicast.
|
|
static bool | sock_udp_ep_is_v6 (const sock_udp_ep_t *ep) |
| Checks if the IP address of an endpoint is an IPv6 address.
|
|
◆ sock_udp_ep_t
An end point for a UDP sock object.
Definition at line 293 of file udp.h.
◆ sock_udp_t
Type for a UDP sock object.
- Note
- API implementers:
struct sock_udp
needs to be defined by implementation-specific sock_types.h
.
Definition at line 301 of file udp.h.
◆ sock_udp_close()
Closes a UDP sock object.
- Precondition
(sock != NULL)
- Parameters
-
[in] | sock | A UDP sock object. |
◆ sock_udp_create()
Creates a new UDP sock object.
- Precondition
(sock != NULL)
-
(remote == NULL) || (remote->port != 0)
- Warning
- If you create a socket you are responsible for receiving messages sent to it by calling sock_udp_recv. Otherwise, the packet queue of the
sock
may congest until the socket is closed. If you only want to send without receiving, use sock_udp_send instead with sock
set to NULL.
- Parameters
-
- Returns
- 0 on success.
-
-EADDRINUSE, if
local != NULL
and local
is already used elsewhere or if local->port == 0
but the pool of ephemeral ports is depleted
-
-EAFNOSUPPORT, if
local != NULL
or remote != NULL
and sock_udp_ep_t::family of local
or remote
is not supported.
-
-EINVAL, if sock_udp_ep_t::addr of
remote
is an invalid address.
-
-EINVAL, if sock_udp_ep_t::netif of
local
or remote
are not a valid interfaces or contradict each other (i.e. (local->netif != remote->netif) && ((local->netif != SOCK_ADDR_ANY_NETIF) || (remote->netif != SOCK_ADDR_ANY_NETIF))
if neither is NULL
).
-
-ENOMEM, if not enough resources can be provided for
sock
to be created.
◆ sock_udp_ep_is_multicast()
Checks if the IP address of an endpoint is multicast.
- Parameters
-
- Returns
- true if end point is multicast
Definition at line 807 of file udp.h.
◆ sock_udp_ep_is_v6()
Checks if the IP address of an endpoint is an IPv6 address.
- Parameters
-
- Returns
- true if end point is IPv6
Definition at line 832 of file udp.h.
◆ sock_udp_get_local()
Gets the local end point of a UDP sock object.
- Precondition
(sock != NULL) && (ep != NULL)
- Parameters
-
[in] | sock | A UDP sock object. |
[out] | ep | The local end point. |
- Returns
- 0 on success.
-
-EADDRNOTAVAIL, when
sock
has no local end point.
◆ sock_udp_get_remote()
Gets the remote end point of a UDP sock object.
- Precondition
(sock != NULL) && (ep != NULL)
- Parameters
-
[in] | sock | A UDP sock object. |
[out] | ep | The remote end point. |
- Returns
- 0 on success.
-
-ENOTCONN, when
sock
has no remote end point bound to it.
◆ sock_udp_recv()
static ssize_t sock_udp_recv |
( |
sock_udp_t * |
sock, |
|
|
void * |
data, |
|
|
size_t |
max_len, |
|
|
uint32_t |
timeout, |
|
|
sock_udp_ep_t * |
remote |
|
) |
| |
|
inlinestatic |
Receives a UDP message from a remote end point.
- Precondition
(sock != NULL) && (data != NULL) && (max_len > 0)
- Parameters
-
[in] | sock | A UDP sock object. |
[out] | data | Pointer where the received data should be stored. |
[in] | max_len | Maximum space available at data . |
[in] | timeout | Timeout for receive in microseconds. If 0 and no data is available, the function returns immediately. May be SOCK_NO_TIMEOUT for no timeout (wait until data is available). |
[out] | remote | Remote end point of the received data. May be NULL , if it is not required by the application. |
- Note
- Function blocks if no packet is currently waiting.
- Returns
- The number of bytes received on success.
-
0, if no received data is available, but everything is in order.
-
-EADDRNOTAVAIL, if local of
sock
is not given.
-
-EAGAIN, if
timeout
is 0
and no data is available.
-
-EINVAL, if
remote
is invalid or sock
is not properly initialized (or closed while sock_udp_recv() blocks).
-
-ENOBUFS, if buffer space is not large enough to store received data.
-
-ENOMEM, if no memory was available to receive
data
.
-
-EPROTO, if source address of received packet did not equal the remote of
sock
.
-
-ETIMEDOUT, if
timeout
expired.
Definition at line 530 of file udp.h.
◆ sock_udp_recv_aux()
Receives a UDP message from a remote end point.
- Precondition
(sock != NULL) && (data != NULL) && (max_len > 0)
- Parameters
-
[in] | sock | A UDP sock object. |
[out] | data | Pointer where the received data should be stored. |
[in] | max_len | Maximum space available at data . |
[in] | timeout | Timeout for receive in microseconds. If 0 and no data is available, the function returns immediately. May be SOCK_NO_TIMEOUT for no timeout (wait until data is available). |
[out] | remote | Remote end point of the received data. May be NULL , if it is not required by the application. |
[out] | aux | Auxiliary data about the received datagram. May be NULL , if it is not required by the application. |
- Note
- Function blocks if no packet is currently waiting.
- Returns
- The number of bytes received on success.
-
0, if no received data is available, but everything is in order.
-
-EADDRNOTAVAIL, if local of
sock
is not given.
-
-EAGAIN, if
timeout
is 0
and no data is available.
-
-EINVAL, if
remote
is invalid or sock
is not properly initialized (or closed while sock_udp_recv() blocks).
-
-ENOBUFS, if buffer space is not large enough to store received data.
-
-ENOMEM, if no memory was available to receive
data
.
-
-EPROTO, if source address of received packet did not equal the remote of
sock
.
-
-ETIMEDOUT, if
timeout
expired.
◆ sock_udp_recv_buf()
static ssize_t sock_udp_recv_buf |
( |
sock_udp_t * |
sock, |
|
|
void ** |
data, |
|
|
void ** |
buf_ctx, |
|
|
uint32_t |
timeout, |
|
|
sock_udp_ep_t * |
remote |
|
) |
| |
|
inlinestatic |
Provides stack-internal buffer space containing a UDP message from a remote end point.
- Precondition
(sock != NULL) && (data != NULL) && (buf_ctx != NULL)
- Parameters
-
[in] | sock | A UDP sock object. |
[out] | data | Pointer to a stack-internal buffer space containing the received data. |
[in,out] | buf_ctx | Stack-internal buffer context. If it points to a NULL pointer, the stack returns a new buffer space for a new packet. If it does not point to a NULL pointer, an existing context is assumed to get a next segment in a buffer. |
[in] | timeout | Timeout for receive in microseconds. If 0 and no data is available, the function returns immediately. May be SOCK_NO_TIMEOUT for no timeout (wait until data is available). |
[out] | remote | Remote end point of the received data. May be NULL , if it is not required by the application. |
- Warning
- This feature is experimental!
This function is quite new, not implemented for all stacks yet, and may be subject to sudden API changes. Do not use in production if this is unacceptable.
- Note
- Function blocks if no packet is currently waiting.
- Returns
- The number of bytes received on success. May not be the complete payload. Continue calling with the returned
buf_ctx
to get more buffers until result is 0 or an error.
-
0, if no received data is available, but everything is in order. If
buf_ctx
was provided, it was released.
-
-EADDRNOTAVAIL, if local of
sock
is not given.
-
-EAGAIN, if
timeout
is 0
and no data is available.
-
-EINVAL, if
remote
is invalid or sock
is not properly initialized (or closed while sock_udp_recv() blocks).
-
-ENOMEM, if no memory was available to receive
data
.
-
-EPROTO, if source address of received packet did not equal the remote of
sock
.
-
-ETIMEDOUT, if
timeout
expired.
Definition at line 627 of file udp.h.
◆ sock_udp_recv_buf_aux()
Provides stack-internal buffer space containing a UDP message from a remote end point.
- Precondition
(sock != NULL) && (data != NULL) && (buf_ctx != NULL)
- Parameters
-
[in] | sock | A UDP sock object. |
[out] | data | Pointer to a stack-internal buffer space containing the received data. |
[in,out] | buf_ctx | Stack-internal buffer context. If it points to a NULL pointer, the stack returns a new buffer space for a new packet. If it does not point to a NULL pointer, an existing context is assumed to get a next segment in a buffer. |
[in] | timeout | Timeout for receive in microseconds. If 0 and no data is available, the function returns immediately. May be SOCK_NO_TIMEOUT for no timeout (wait until data is available). |
[out] | remote | Remote end point of the received data. May be NULL , if it is not required by the application. |
[out] | aux | Auxiliary data about the received datagram. May be NULL , if it is not required by the application. |
- Warning
- This feature is experimental!
This function is quite new, not implemented for all stacks yet, and may be subject to sudden API changes. Do not use in production if this is unacceptable.
- Note
- Function blocks if no packet is currently waiting.
- Returns
- The number of bytes received on success. May not be the complete payload. Continue calling with the returned
buf_ctx
to get more buffers until result is 0 or an error.
-
0, if no received data is available, but everything is in order. If
buf_ctx
was provided, it was released.
-
-EADDRNOTAVAIL, if local of
sock
is not given.
-
-EAGAIN, if
timeout
is 0
and no data is available.
-
-EINVAL, if
remote
is invalid or sock
is not properly initialized (or closed while sock_udp_recv() blocks).
-
-ENOMEM, if no memory was available to receive
data
.
-
-EPROTO, if source address of received packet did not equal the remote of
sock
.
-
-ETIMEDOUT, if
timeout
expired.
◆ sock_udp_send()
Sends a UDP message to remote end point.
- Precondition
((sock != NULL || remote != NULL)) && (if (len != 0): (data != NULL))
- Parameters
-
[in] | sock | A UDP sock object. May be NULL . A sensible local end point should be selected by the implementation in that case. |
[in] | data | Pointer where the received data should be stored. May be NULL if len == 0 . |
[in] | len | Maximum space available at data . |
[in] | remote | Remote end point for the sent data. May be NULL , if sock has a remote end point. sock_udp_ep_t::family may be AF_UNSPEC, if local end point of sock provides this information. sock_udp_ep_t::port may not be 0. |
- Returns
- The number of bytes sent on success.
-
-EADDRINUSE, if
sock
has no local end-point or was NULL
and the pool of available ephemeral ports is depleted.
-
-EAFNOSUPPORT, if
remote != NULL
and sock_udp_ep_t::family of remote
is != AF_UNSPEC and not supported.
-
-EHOSTUNREACH, if
remote
or remote end point of sock
is not reachable.
-
-EINVAL, if sock_udp_ep_t::addr of
remote
is an invalid address.
-
-EINVAL, if sock_udp_ep_t::netif of
remote
is not a valid interface or contradicts the given local interface (i.e. neither the local end point of sock
nor remote are assigned to SOCK_ADDR_ANY_NETIF
but are nevertheless different.
-
-EINVAL, if sock_udp_ep_t::port of
remote
is 0.
-
-ENOMEM, if no memory was available to send
data
.
-
-ENOTCONN, if
remote == NULL
, but sock
has no remote end point.
Definition at line 754 of file udp.h.
◆ sock_udp_send_aux()
Sends a UDP message to remote end point.
- Precondition
((sock != NULL || remote != NULL)) && (if (len != 0): (data != NULL))
- Parameters
-
[in] | sock | A UDP sock object. May be NULL . A sensible local end point should be selected by the implementation in that case. |
[in] | data | Pointer where the received data should be stored. May be NULL if len == 0 . |
[in] | len | Maximum space available at data . |
[in] | remote | Remote end point for the sent data. May be NULL , if sock has a remote end point. sock_udp_ep_t::family may be AF_UNSPEC, if local end point of sock provides this information. sock_udp_ep_t::port may not be 0. |
[out] | aux | Auxiliary data about the transmission. May be NULL , if it is not required by the application. |
- Returns
- The number of bytes sent on success.
-
-EADDRINUSE, if
sock
has no local end-point or was NULL
and the pool of available ephemeral ports is depleted.
-
-EAFNOSUPPORT, if
remote != NULL
and sock_udp_ep_t::family of remote
is != AF_UNSPEC and not supported.
-
-EHOSTUNREACH, if
remote
or remote end point of sock
is not reachable.
-
-EINVAL, if sock_udp_ep_t::addr of
remote
is an invalid address.
-
-EINVAL, if sock_udp_ep_t::netif of
remote
is not a valid interface or contradicts the given local interface (i.e. neither the local end point of sock
nor remote are assigned to SOCK_ADDR_ANY_NETIF
but are nevertheless different.
-
-EINVAL, if sock_udp_ep_t::port of
remote
is 0.
-
-ENOMEM, if no memory was available to send
data
.
-
-ENOTCONN, if
remote == NULL
, but sock
has no remote end point.
Definition at line 707 of file udp.h.
◆ sock_udp_sendv()
Sends a UDP message to remote end point with non-continous payload.
- Precondition
((sock != NULL || remote != NULL))
- Parameters
-
[in] | sock | A UDP sock object. May be NULL . A sensible local end point should be selected by the implementation in that case. |
[in] | snips | List of payload chunks, will be processed in order. May be NULL . |
[in] | remote | Remote end point for the sent data. May be NULL , if sock has a remote end point. sock_udp_ep_t::family may be AF_UNSPEC, if local end point of sock provides this information. sock_udp_ep_t::port may not be 0. |
- Returns
- The number of bytes sent on success.
-
-EADDRINUSE, if
sock
has no local end-point or was NULL
and the pool of available ephemeral ports is depleted.
-
-EAFNOSUPPORT, if
remote != NULL
and sock_udp_ep_t::family of remote
is != AF_UNSPEC and not supported.
-
-EHOSTUNREACH, if
remote
or remote end point of sock
is not reachable.
-
-EINVAL, if sock_udp_ep_t::addr of
remote
is an invalid address.
-
-EINVAL, if sock_udp_ep_t::netif of
remote
is not a valid interface or contradicts the given local interface (i.e. neither the local end point of sock
nor remote are assigned to SOCK_ADDR_ANY_NETIF
but are nevertheless different.
-
-EINVAL, if sock_udp_ep_t::port of
remote
is 0.
-
-ENOMEM, if no memory was available to send
data
.
-
-ENOTCONN, if
remote == NULL
, but sock
has no remote end point.
Definition at line 793 of file udp.h.
◆ sock_udp_sendv_aux()
Sends a UDP message to remote end point with non-continous payload.
- Precondition
((sock != NULL || remote != NULL))
- Parameters
-
[in] | sock | A UDP sock object. May be NULL . A sensible local end point should be selected by the implementation in that case. |
[in] | snips | List of payload chunks, will be processed in order. May be NULL . |
[in] | remote | Remote end point for the sent data. May be NULL , if sock has a remote end point. sock_udp_ep_t::family may be AF_UNSPEC, if local end point of sock provides this information. sock_udp_ep_t::port may not be 0. |
[out] | aux | Auxiliary data about the transmission. May be NULL , if it is not required by the application. |
- Returns
- The number of bytes sent on success.
-
-EADDRINUSE, if
sock
has no local end-point or was NULL
and the pool of available ephemeral ports is depleted.
-
-EAFNOSUPPORT, if
remote != NULL
and sock_udp_ep_t::family of remote
is != AF_UNSPEC and not supported.
-
-EHOSTUNREACH, if
remote
or remote end point of sock
is not reachable.
-
-EINVAL, if sock_udp_ep_t::addr of
remote
is an invalid address.
-
-EINVAL, if sock_udp_ep_t::netif of
remote
is not a valid interface or contradicts the given local interface (i.e. neither the local end point of sock
nor remote are assigned to SOCK_ADDR_ANY_NETIF
but are nevertheless different.
-
-EINVAL, if sock_udp_ep_t::port of
remote
is 0.
-
-ENOMEM, if no memory was available to send
data
.
-
-ENOTCONN, if
remote == NULL
, but sock
has no remote end point.