当前位置: 首页 > news >正文

UDP协议详细讲解及C++代码实例

目录

    • 一、UDP协议概述
    • 二、UDP通信流程
      • 1)数据传输
      • 2)无连接
    • 三、关键点解析
      • 1) 套接字创建
      • 2)无连接特性
      • 3)数据传输
    • 四、总结

UDP协议详细讲解及C++代码实例

一、UDP协议概述

UDP(User Datagram Protocol,用户数据报协议)是一种无连接的、简单的、基于数据报的传输层通信协议。其核心特性包括:

  • 无连接:不需要建立连接即可发送数据。
  • 不可靠:不保证数据包的顺序和到达。
  • 高效:由于没有复杂的连接和可靠性机制,UDP传输效率较高。
  • 适用场景:适用于实时性要求高、可以容忍少量数据丢失的场景,如视频流、实时游戏等。

二、UDP通信流程

1)数据传输

数据被分割为多个UDP数据报,每个数据报独立传输。

2)无连接

通信双方无需建立连接,直接发送和接收数据。

C++代码实例

1. UDP客户端代码(C++)
cpp
#include <iostream>
#include <cstring>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>int main() {// 创建UDP套接字int client_socket = socket(AF_INET, SOCK_DGRAM, 0);if (client_socket == -1) {std::cerr << "Failed to create socket." << std::endl;return -1;}// 设置服务器地址和端口sockaddr_in server_address{};server_address.sin_family = AF_INET;server_address.sin_port = htons(8888);server_address.sin_addr.s_addr = inet_addr("127.0.0.1");try {// 发送数据const char* message = "Hello, UDP Server!";sendto(client_socket, message, strlen(message), 0, (struct sockaddr*)&server_address, sizeof(server_address));// 接收响应char buffer[1024] = {0};socklen_t server_address_size = sizeof(server_address);int bytes_received = recvfrom(client_socket, buffer, sizeof(buffer), 0, (struct sockaddr*)&server_address, &server_address_size);if (bytes_received > 0) {std::cout << "Received from server: " << buffer << std::endl;}} catch (...) {std::cerr << "An error occurred during communication." << std::endl;}// 关闭套接字close(client_socket);return 0;
}
2. UDP服务器端代码(C++)
cpp
#include <iostream>
#include <cstring>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>int main() {// 创建UDP套接字int server_socket = socket(AF_INET, SOCK_DGRAM, 0);if (server_socket == -1) {std::cerr << "Failed to create socket." << std::endl;return -1;}// 绑定地址和端口sockaddr_in server_address{};server_address.sin_family = AF_INET;server_address.sin_port = htons(8888);server_address.sin_addr.s_addr = INADDR_ANY;if (bind(server_socket, (struct sockaddr*)&server_address, sizeof(server_address)) == -1) {std::cerr << "Failed to bind socket." << std::endl;close(server_socket);return -1;}std::cout << "Server is listening on port 8888..." << std::endl;try {while (true) {// 接收数据char buffer[1024] = {0};sockaddr_in client_address{};socklen_t client_address_size = sizeof(client_address);int bytes_received = recvfrom(server_socket, buffer, sizeof(buffer), 0, (struct sockaddr*)&client_address, &client_address_size);if (bytes_received > 0) {std::cout << "Received from client: " << buffer << std::endl;// 发送响应const char* response = "Hello, UDP Client!";sendto(server_socket, response, strlen(response), 0, (struct sockaddr*)&client_address, client_address_size);}}} catch (...) {std::cerr << "An error occurred in the server loop." << std::endl;}// 关闭套接字close(server_socket);return 0;
}

三、关键点解析

1) 套接字创建

socket(AF_INET, SOCK_DGRAM, 0):创建IPv4的UDP套接字。

2)无连接特性

使用sendto()和recvfrom()发送和接收数据,无需建立连接。

3)数据传输

sendto():发送数据到指定地址。
recvfrom():接收数据,并获取发送方的地址信息。

四、总结

UDP协议通过无连接、简单高效的特性,适用于实时性要求高的场景。上述代码示例展示了UDP客户端和服务端的完整交互流程,适用于需要高效传输且能容忍少量数据丢失的场景。

http://www.xdnf.cn/news/432217.html

相关文章:

  • 数据压缩的概念和优缺点
  • 【电子科技大学主办 | 往届快至会后2个月EI检索】第六届电子通讯与人工智能国际学术会议(ICECAI 2025)
  • Gatsby知识框架
  • angular的rxjs中的操作符
  • Vitrualbox完美显示系统界面(只需三步)
  • vue2将文字转为拼音
  • Python 基础语法
  • Redis——数据结构
  • 精准预测蛋白质稳定性的强大工具
  • 深入理解Python逻辑判断、循环与推导式(附实战案例)
  • 通讯录程序
  • 企业ERP系统软件有哪些品牌?
  • 工业4.0之实时革新RTOS助力德国“灯塔工厂”实现跨域协同
  • 蓝桥杯 10. 全球变暖
  • redis数据结构-09 (ZADD、ZRANGE、ZRANK)
  • 论文解读:Drivestudio——OmniRe: Omni Urban Scene Reconstruction
  • 【漫话机器学习系列】257.填补缺失值(Imputing Missing Values)
  • OpenAI新开源项目Codex CLI提升开发效率的新利器
  • 国自然项目|朱蓓薇院士团队谭明乾教授课题组在ACS Nano(IF=15.8)发表高水平文章!
  • 雅思口语 Part 1 Math
  • 从零开始掌握FreeRTOS(2)链表之节点的定义
  • 虹科干货 | CAN XL安全实践:深度防御下的密钥协商优化
  • 自然语言生成在商业智能中的应用实践
  • Future,Callable,CompletableFuture是什么?
  • 2025年项目管理软件革命:AI与国产化浪潮如何重塑企业协作生态
  • tc qdisc参数详解
  • 智慧校园场景下iVX 研发基座应用实践与行业适配研究
  • Milvus(21):过滤搜索、范围搜索、分组搜索
  • python面试实战经验分享
  • Python 实战:如何智能修改字典中的实体值?