当前位置:首页 > C++ > 正文

C++实现UDP通信(零基础入门C++ UDP编程教程)

在现代网络应用中,C++ UDP编程是一种高效、轻量级的通信方式。与TCP不同,UDP(User Datagram Protocol)不建立连接,直接发送数据包,适用于对实时性要求高但允许少量丢包的场景,如视频流、在线游戏和物联网设备通信。

C++实现UDP通信(零基础入门C++ UDP编程教程) C++ UDP编程 UDP通信 C++网络编程 socket编程教程 第1张

什么是UDP?

UDP 是一种无连接的传输层协议。它不保证数据包的顺序、可靠性或完整性,但具有低延迟、开销小的优点。在 C++网络编程 中,使用 socket API 可以轻松实现 UDP 通信。

UDP 编程基本流程

  • 服务端:创建 socket → 绑定地址 → 接收/发送数据
  • 客户端:创建 socket → 直接发送/接收数据(无需连接)

C++ UDP 服务端代码示例

以下是一个简单的 UDP 服务端程序,它监听指定端口并回显收到的消息:

#include <iostream>#include <cstring>#include <sys/socket.h>#include <netinet/in.h>#include <unistd.h>int main() {    // 创建UDP socket    int server_fd = socket(AF_INET, SOCK_DGRAM, 0);    if (server_fd < 0) {        std::cerr << "Socket creation failed!\n";        return -1;    }    // 配置服务器地址    struct sockaddr_in server_addr;    memset(&server_addr, 0, sizeof(server_addr));    server_addr.sin_family = AF_INET;    server_addr.sin_port = htons(8080);          // 监听8080端口    server_addr.sin_addr.s_addr = INADDR_ANY;    // 接受任意IP    // 绑定socket到地址    if (bind(server_fd, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) {        std::cerr << "Bind failed!\n";        close(server_fd);        return -1;    }    std::cout << "UDP Server listening on port 8080...\n";    char buffer[1024];    struct sockaddr_in client_addr;    socklen_t client_len = sizeof(client_addr);    while (true) {        // 接收数据        int n = recvfrom(server_fd, buffer, sizeof(buffer), 0,                         (struct sockaddr*)&client_addr, &client_len);        if (n > 0) {            buffer[n] = '\0';            std::cout << "Received from client: " << buffer << std::endl;            // 回显数据            sendto(server_fd, buffer, n, 0,                   (struct sockaddr*)&client_addr, client_len);        }    }    close(server_fd);    return 0;}

C++ UDP 客户端代码示例

客户端向服务端发送消息并接收回显:

#include <iostream>#include <cstring>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <unistd.h>int main() {    int client_fd = socket(AF_INET, SOCK_DGRAM, 0);    if (client_fd < 0) {        std::cerr << "Socket creation failed!\n";        return -1;    }    struct sockaddr_in server_addr;    memset(&server_addr, 0, sizeof(server_addr));    server_addr.sin_family = AF_INET;    server_addr.sin_port = htons(8080);    inet_pton(AF_INET, "127.0.0.1", &server_addr.sin_addr); // 本地回环地址    const char* message = "Hello from UDP Client!";    sendto(client_fd, message, strlen(message), 0,           (struct sockaddr*)&server_addr, sizeof(server_addr));    char buffer[1024];    socklen_t server_len = sizeof(server_addr);    int n = recvfrom(client_fd, buffer, sizeof(buffer), 0,                     (struct sockaddr*)&server_addr, &server_len);    if (n > 0) {        buffer[n] = '\0';        std::cout << "Echo from server: " << buffer << std::endl;    }    close(client_fd);    return 0;}

编译与运行

将服务端代码保存为 udp_server.cpp,客户端代码保存为 udp_client.cpp,然后在 Linux 或 macOS 终端中执行:

g++ -o server udp_server.cppg++ -o client udp_client.cpp# 先运行服务端./server# 再打开新终端运行客户端./client

注意事项

  • UDP 不保证数据可靠传输,重要数据需自行添加重传机制。
  • Windows 平台需包含 <winsock2.h> 并初始化 WSAStartup。
  • 本教程基于 POSIX 标准,适用于 Linux/macOS;Windows 用户需做适当调整。

总结

通过本教程,你已掌握 UDP通信 的基本原理和 socket编程教程 中的核心实现方法。无论是开发实时音视频应用,还是构建轻量级 IoT 通信系统,C++ UDP 编程都是不可或缺的技能。动手实践是掌握 C++网络编程 的最佳方式,快去尝试修改代码、扩展功能吧!