Welcome to ESP32 Core Board repository
4. UDP Client Experiment
UDP Client Experiment
UDP Client Experiment1. UDP Overview2. Core Concepts2.1 UDP Socket Communication Flow2.2 sendto() and recvfrom()2.3 Non-Blocking Receive (MSG_DONTWAIT)2.4 Network Byte Order3. Project Architecture and Flow3.1 UDP Client4. Hardware Dependencies5. Source Code Analysis — UDP Client5.1 Macro Configuration5.2 WiFi Initialization (Review)5.3 vUdpClientTask() — Send/Receive Loop6. Operation Flow6.1 Compilation and Flashing Flow6.2 Test Method7.3 Normal Log — Client8. Common Problems
1. UDP Overview
UDP (User Datagram Protocol) is a connectionless, unreliable but efficient transport layer protocol. Unlike TCP, UDP doesn't establish connections, doesn't guarantee delivery, doesn't guarantee order, but low overhead, low latency, very suitable for scenarios with high real-time requirements and tolerable occasional packet loss.
In IoT applications, UDP is widely used for high-frequency sensor data reporting (e.g., temperature/humidity sampled 100 times per second, losing a few frames is fine), LAN device discovery (broadcast/multicast to detect online devices in same subnet), DNS domain name resolution (small query volume, timeout retry works), and real-time audio/video streaming (latency priority over画质完整性). Mastering UDP's sendto()/recvfrom() programming model is the foundation for advanced experiments like custom protocol packing, real-time data reporting and LAN device discovery.
| Feature | UDP | TCP |
|---|---|---|
| Connection | Connectionless, send directly | Three-way handshake to establish connection |
| Reliability | No guarantee of delivery, no guarantee of order | Guarantee delivery, guarantee order |
| Transmission Efficiency | High (8-byte header) | Lower (20-byte header) |
| Typical Use | Video streaming, DNS, IoT sensor data | Web, file transfer, MQTT |
| Core APIs | sendto() / recvfrom() | send() / recv() |
This project contains UDP client and server two sub-examples: client sends data periodically and receives server replies; server listens on port, automatically replies to received data.
2. Core Concepts
2.1 UDP Socket Communication Flow
┌─── UDP Client ──────────────────────┐ ┌─── UDP Server ──────────────────────┐│ │ │ ││ socket(AF_INET, SOCK_DGRAM, 0) │ │ socket(AF_INET, SOCK_DGRAM, 0) ││ ↓ │ │ ↓ ││ (No need for bind, system auto-assigns port) │ │ bind(INADDR_ANY, 8080) ││ ↓ │ │ ↓ ││ sendto(192.168.11.183:8080, data) │───→│ recvfrom() ← Received "Hello..." ││ ↓ │ │ ↓ ││ recvfrom() ← Receive reply │←───│ sendto() → Reply "I am ESP32..." ││ │ │ │└────────────────────────────────────┘ └────────────────────────────────────┘
2.2 sendto() and recvfrom()
sendto() and recvfrom() are the two core APIs for UDP programming - the former sends datagrams with target address, the latter receives data while getting sender address for reply.
x// Send: specify target IP and portssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen);
// Receive: also get sender address (for reply)ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);2.3 Non-Blocking Receive (MSG_DONTWAIT)
MSG_DONTWAIT flag makes recvfrom() non-blocking - returns -1 immediately (errno=EAGAIN) when no data without blocking task. This example uses 10ms high-frequency polling, ensuring low-latency receive while not affecting timed sending:
xxxxxxxxxx