3#include <zephyr/net/net_ip.h>
4#include <zephyr/net/socket.h>
5#include <zephyr/sys/util.h>
32 sock = zsock_socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
33 if (sock < 0)
return 0;
36 addr.sin_family = AF_INET;
37 addr.sin_port =
htons(port);
38 addr.sin_addr.s_addr =
htonl(INADDR_ANY);
40 if (zsock_bind(sock, (sockaddr*)&addr,
sizeof(addr)) < 0) {
58 sock = zsock_socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
59 if (sock < 0)
return 0;
63 zsock_setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &reuse,
sizeof(reuse));
67 addr.sin_family = AF_INET;
68 addr.sin_port =
htons(port);
69 addr.sin_addr.s_addr =
htonl(INADDR_ANY);
71 if (zsock_bind(sock, (sockaddr*)&addr,
sizeof(addr)) < 0) {
78 struct ip_mreq mreq{};
79 mreq.imr_multiaddr.s_addr =
htonl((uint32_t)multicast);
80 mreq.imr_interface.s_addr =
htonl(INADDR_ANY);
82 if (zsock_setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq,
89 multicast_addr = multicast;
98 struct ip_mreq mreq{};
99 mreq.imr_multiaddr.s_addr =
htonl((uint32_t)multicast_addr);
100 mreq.imr_interface.s_addr =
htonl(INADDR_ANY);
101 zsock_setsockopt(sock, IPPROTO_IP, IP_DROP_MEMBERSHIP,
102 &mreq,
sizeof(mreq));
103 is_multicast =
false;
115 memset(&tx_addr, 0,
sizeof(tx_addr));
117 tx_addr.sin_family = AF_INET;
118 tx_addr.sin_port =
htons(port);
120 if (zsock_inet_pton(AF_INET, host, &tx_addr.sin_addr) != 1) {
130 memset(&tx_addr, 0,
sizeof(tx_addr));
131 tx_addr.sin_family = AF_INET;
132 tx_addr.sin_port =
htons(port);
133 tx_addr.sin_addr.s_addr =
htonl((uint32_t)ip);
139 if (sock < 0)
return 0;
143 iov.iov_base = tx_buffer;
144 iov.iov_len = tx_len;
147 msg.msg_name = &tx_addr;
148 msg.msg_namelen =
sizeof(tx_addr);
152 int ret = zsock_sendmsg(sock, &msg, 0);
160 if (tx_len <
sizeof(tx_buffer)) {
161 tx_buffer[tx_len++] = b;
167 size_t write(
const uint8_t* data,
size_t len) {
168 size_t space =
sizeof(tx_buffer) - tx_len;
169 if (len > space) len = space;
171 memcpy(tx_buffer + tx_len, data, len);
184 socklen_t from_len =
sizeof(from);
187 int len = zsock_recvfrom(sock, rx_buffer,
sizeof(rx_buffer), MSG_DONTWAIT,
188 (sockaddr*)&from, &from_len);
190 if (len <= 0)
return 0;
209 if (rx_offset >= rx_len)
return -1;
210 return rx_buffer[rx_offset++];
213 int read(uint8_t* dst,
size_t len) {
215 if (avail <= 0)
return 0;
217 if (len > (
size_t)avail) len = avail;
219 memcpy(dst, rx_buffer + rx_offset, len);
225 return read(dest, len);
229 if (rx_offset >= rx_len)
return -1;
230 return rx_buffer[rx_offset];
245 static char buffer[40];
248 zsock_inet_ntop(AF_INET, &last_from.sin_addr, buf, INET_ADDRSTRLEN);
262 uint16_t local_port = 0;
265 uint8_t tx_buffer[1472];
267 sockaddr_in tx_addr{};
270 uint8_t rx_buffer[1472];
272 size_t rx_offset = 0;
274 sockaddr_in last_from{};
275 bool is_multicast =
false;
276 IPAddress multicast_addr;
#define htons(x)
Definition Net.h:15
#define ntohl(x)
Definition Net.h:16
#define ntohs(x)
Definition Net.h:17
#define htonl(x)
Definition Net.h:14