yahboom
HomeLearn
Solution
Blog
Online Store
About Us
EN/中文
ESP32 Core Board📖
1. ESP32 Introduction
  • 1. ESP32S3 Overview
  • 2. Environment Setup Introduction
  • 3. Dev Board Introduction
2. ESP-IDF Development Tutorial
1. Before Development
  • 1. Environment Setup (Windows)
  • 2. Environment Setup (Linux)
  • 3. Build and Flash
2. Basic Peripherals
  • 1. LED Control
  • 2. Button Detection
  • 3. Peripheral Interrupts
  • 4. ESP_TIMER
  • 5. GPTIMER
  • 6. Watchdog Timer
  • 7. DMA
  • 8. ADC
  • 9. PWM Breathing LED
  • 10. RGB LED Effects
3. Serial Communication and Storage System
  • 1. Serial UART Communication Experiment
  • 2. I2C_OLED Display Experiment
  • 3. SPI Bus Communication Experiment
  • 4. PSRAM External Memory Experiment
  • 5. Flash Read and Write Experiment
  • 6. USB Emulated Mass Storage Experiment
4. FreeRTOS operating system
  • 1.FreeRTOS Core Concepts Theory
  • 2.Task Creation and Management
  • 3.Queue
  • 4.Binary Semaphore
  • 5.Mutex
  • 6.Event Groups
  • 7.Software Timer
  • 8.Task Scheduler
  • 9.Low Power Mode
  • 10.Deadlock
  • 11.Priority Inversion
5. Network Protocols and Wireless Communication
  • 1. WIFI Network Basics
  • 2. WIFI STA Mode
  • 3. WIFI AP Mode
  • 4. UDP Client Experiment
  • 5. UDP Server Experiment
  • 6. TCP Client Experiment
  • 7. TCP Server Experiment
  • 8. Socket Programming Basics
  • 9. HTTP Client Experiment
  • 10. HTTP Server Experiment
  • 11. MQTT IoT Communication Protocol
  • 12. WIFI OTA Upgrade
  • 13. Bluetooth Fundamentals
  • 14. Bluetooth Slave Mode
  • 15. Bluetooth Master Mode
6. Audio Applications
  • 1.I2S Microphone Recording and U-Disk Playback
  • 2.I2S Audio Playback Experiment
  • 3.Repeater Experiment
7. Xiaozhi AI Voice
  • 1. Burn Xiaozhi Firmware
  • 2. Network and Configuration
  • 3. AI Agent Settings
  • 4. Program Analysis
  • 5. Free Chat
3. Arduino Development Course
1. Before Development
  • 1. Environment Setup
  • 2. Build and Flash
2. Basic Peripherals
  • 1. LED Control
  • 2. Button Detection
  • 3. Peripheral Interrupts
  • 4. ESP_TIMER
  • 5. GPTIMER
  • 6. Watchdog Timer
  • 7. ADC
  • 8. PWM Breathing LED
  • 9. RGB LED Effects
3. Serial Communication and Storage System
  • 1. Serial UART Communication
  • 2. I2C OLED Display
  • 3. SPI Bus Communication
  • 4. Flash Read and Write
  • 5. USB Emulated Mass Storage
4. Network Protocols and Wireless Communication
  • 1. WIFI Network Basics
  • 2. WIFI STA Mode
  • 3. WIFI AP Mode
  • 4. UDP Server Experiment
  • 5. UDP Client Experiment
  • 6. TCP Client Experiment
  • 7. TCP Server Experiment
  • 8. HTTP Client Experiment
  • 9. HTTP Server Experiment
  • 10. MQTT IoT Communication Protocol
  • 11. WIFI OTA Upgrade
  • 12. Bluetooth Fundamentals
  • 13. Bluetooth Slave Mode
  • 14. Bluetooth Master Mode
5. Audio Applications
  • 1.I2S Microphone Recording and U-Disk Playback
  • 2.I2S Audio Playback Experiment
  • 3.Repeater Experiment
4. MicroPython Development Course
1. Before Development
  • 1. Environment Setup
  • 2. Build and Flash
  • 3. Thonny IDE
2. Basic Peripherals
  • 1. LED Control
  • 2. Button Detection
  • 3. Peripheral Interrupts
  • 4. TIMER_IT
  • 5. Watchdog Timer
  • 6. ADC
  • 7. PWM Breathing LED
  • 8. RGB LED Effects
3. Serial Communication and Storage System
  • 1. Serial UART Communication Experiment
  • 2. I2C_OLED Display Experiment
  • 3. SPI Bus Communication Experiment
  • 4. Flash Read and Write Experiment
  • 5. Print Storage
4. Network Protocols and Wireless Communication
  • 1. WIFI Network Basics
  • 2. WIFI STA Mode
  • 3. WIFI AP Mode
  • 4. UDP Client Experiment
  • 5. UDP Server Experiment
  • 6. TCP Client Experiment
  • 7. TCP Server Experiment
  • 8. HTTP Client Experiment
  • 9. HTTP Server Experiment
  • 10. MQTT
  • 11. Bluetooth Fundamentals
  • 12. Bluetooth Slave Mode
  • 13. Bluetooth Master Mode
5. Audio Applications
  • 1. I2S Audio Playback Experiment
  • 2. Repeater Experiment
Download
  • Code
  • Hardware_Info
  • 3D_Model_File
  • Software_Tools
  • VMware
  • VM_File
Download ZIP

Welcome to ESP32 Core Board repository

5. UDP Server Experiment

UDP Server Experiment


UDP Server 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 Server4. Hardware Dependencies5. Source Code Analysis — UDP Server5.1 vUdpServerTask() — Listen and Auto Reply6. Operation Flow6.1 Compilation and Flashing Flow6.2 Test Method6.4 Normal Log — Server7. 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 quality integrity). 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.

FeatureUDPTCP
ConnectionConnectionless, send directlyThree-way handshake to establish connection
ReliabilityNo guarantee of delivery, no guarantee of orderGuarantee delivery, guarantee order
Transmission EfficiencyHigh (8-byte header)Lower (20-byte header)
Typical UseVideo streaming, DNS, IoT sensor dataWeb, file transfer, MQTT
Core APIssendto() / 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 port
ssize_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
int recv_len = recvfrom(sock_fd, recv_buf, sizeof(recv_buf)-1,
                         // Non-blocking flag
                         MSG_DONTWAIT,
                         (struct sockaddr *)&from_addr, &len);

2.4 Network Byte Order

Network protocols use Big-Endian uniformly, while ESP32 is little-endian CPU. Ports and IP addresses must be converted - htons() converts port number, inet_pton() converts IP string to network-order binary:

xxxxxxxxxx
// Port to network byte order
dest_addr.sin_port = htons(8080);
inet_pton(AF_INET, "192.168.1.1", &addr);

3. Project Architecture and Flow

3.1 UDP Server

xxxxxxxxxx
app_main()
  ├─ wifi_init()                        ← WiFi STA initialization (wait for IP)
  │
  └─ xTaskCreate(vUdpServerTask, ...)   ← Create UDP server task
      └─ vUdpServerTask():
          ├─ socket(AF_INET, SOCK_DGRAM, 0)  → Create UDP socket
          ├─ bind(INADDR_ANY, 8080)          → Bind listening port
          └─ while(1):
              ├─ recvfrom(MSG_DONTWAIT) ← Non-blocking receive client data
              ├─ If valid data received → sendto() auto reply
              └─ vTaskDelay(10ms)

4. Hardware Dependencies

  • Hardware Connection: No external wiring, WiFi wireless communication

  • Client Dependent Components: lwip/sockets, esp_wifi, esp_netif, esp_event, nvs_flash, FreeRTOS

  • Server Dependent Components: Same as above, additional lwip/netdb


5. Source Code Analysis — UDP Server

Complete source code: Source Code → ESP-IDF → 5.Network_Protocol → 3.UDP → UDP_Server

5.1 vUdpServerTask() — Listen and Auto Reply

The biggest difference between UDP server and client is just one line of code: server must bind() port. Without bind, OS doesn't know which Socket to throw data to. When binding, use INADDR_ANY - meaning "regardless of which network interface the message came from, as long as it's this port, receive it".

recvfrom() has a benefit: it not only receives the data, but also automatically fills in the sender's address (client_addr). Server gets this address and can directly sendto() back, no need to pre-configure target address like client does.

xxxxxxxxxx
void vUdpServerTask(void *pv)
{
    int sock_fd;
    struct sockaddr_in server_addr = {0};

    // Create UDP socket
    sock_fd = socket(AF_INET, SOCK_DGRAM, 0);

    // Bind port
    server_addr.sin_family = AF_INET;
    // Listen all IP
    server_addr.sin_addr.s_addr = INADDR_ANY;
    server_addr.sin_port = htons(UDP_SERVER_PORT);  // Port number
    bind(sock_fd, (struct sockaddr *)&server_addr, sizeof(server_addr));

    while (1)
    {
struct sockaddr_in client_addr;             // Client address
        socklen_t client_len = sizeof(client_addr);
        char recv_buf[128] = {0};

        // Non-blocking receive
        int recv_len = recvfrom(sock_fd, recv_buf, sizeof(recv_buf)-1,
                                MSG_DONTWAIT,
                                (struct sockaddr *)&client_addr, &client_len);
        if (recv_len > 0)
        {
            recv_buf[recv_len] = '\0';
            ESP_LOGI(TAG, "Receive computer messages: %s", recv_buf);

            // Auto reply
            char reply_msg[] = "I am ESP32 UDP Server!";
            // Reply to client
            sendto(sock_fd, reply_msg, strlen(reply_msg), 0,
                   (struct sockaddr *)&client_addr, client_len);        
        }

        vTaskDelay(10);                                                 
    }
    close(sock_fd);
    vTaskDelete(NULL);
}

6. Operation Flow

6.1 Compilation and Flashing Flow

ESP-IDF flashing flow: See ESP-IDF → 1. Before Development → 3. Build and Flash.

6.2 Test Method

Flash UDP_Server to ESP32, PC side sends data to ESP32's IP port 8080, ESP32 automatically replies I am ESP32 UDP Server!. For convenience, we can use another network debug assistant for the server side.

Network Debug Assistant 2

Click page to open, ① select UDP Client ② select create

③ port keep same as code (8080 as example)

Server IP

④ don't check HEX format

⑤ enter message in text box

6.4 Normal Log — Server

xxxxxxxxxx
I (2856) UDP-SERVER: Got IP: 192.168.11.181
I (2858) UDP-SERVER: WiFi connected successfully!
I (2860) UDP-SERVER: UDP server created successfully!
I (2862) UDP-SERVER: Port 8080 bound successfully
I (5000) UDP-SERVER: Receive computer messages: Hello ESP
I (5001) UDP-SERVER: Replied to the computer: I am ESP32 UDP Server!

Server Serial Print


7. Common Problems

SymptomCauseSolution
Client Send failed, errno=xxxTarget IP unreachable or port not listeningCheck PC and ESP32 on same LAN, confirm PC UDP listening on 8080
Server can't receive client dataESP32 IP changed / firewall blockedCheck ESP32 actual IP via serial, PC firewall allows 8080 port
High receive latencyvTaskDelay too largeEnsure polling interval ≤ 20ms
Failed to create UDP socketSocket descriptor exhaustedCheck if forgot close() old Socket
Failed to bind portPort already in useChange UDP_SERVER_PORT
Continuous sends but PC only receives partialUDP no flow control, network congestion packet lossIncrease send interval / add ACK confirmation on sender (custom application layer protocol)
Chinese text garbledTerminal encoding inconsistencyCheck serial assistant and network debug tool encoding settings (UTF-8)
UDP Client Experiment
TCP Client Experiment

COMPANY

  • About us
  • Team Style
  • Blog

LEARNING & EXPLORATION

  • Tutorials
  • Edge AI hardware
  • Educational robots
  • Embedded intelligent hardware

WHERE TO BUY

  • Yahboom Online Store
  • Amazon
  • Alibaba
  • AliExpress
  • Mercado

TECHNOLOGY SUPPORT

  • Email: support@yahboom.com

BE A DISTRIBUTOR

  • Email: sales@yahboom.com
QR Code
QR Code

Copyright © 2017-2026 Yahboom. All Rights Reserved.

EN/中文