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

Linux驱动06 --- UDP

目录

 一、UDP

1.1 介绍

1.2 UDP 的通信方式

1.3 单播

        发送函数        

        接收函数

1.4 广播

1.5 组播/多播


一、UDP

1.1 介绍

        传输层的另外一个协议

                面向无连接,不稳定,速度快,可以一对多

                UDP(User Datagram Protocol,用户数据报协议)是在一组互连的计算机网络环境中提供分组交换计算机通信的数据报模式。该协议假定使用 IP 作为底层协议,按照OSI 模型工作在传输层。UDP 为应用程序提供了一种以最少的协议机制向其他程序发送消息的过程。该协议是面向事务的,不保证传递和重复保护。需要有序、可靠地传输数据流的应用程序应使用传输控制协议 (TCP)。

1.2 UDP 的通信方式

        UDP 通信分为发送方和接收方

        发送方和接收方的通信全靠 IP 和端口

        而 TCP 靠对方的通信套接字

        发送方:

                创建套接字 --- socket

                直接发送消息 --- sendto

        接收方:

                创建套接字 --- socket

                绑定自身的 IP 和端口 --- bind

                接收消息 --- recvfrom

1.3 单播

        一对一通信

        发送函数        

        函数原型

                ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,const struct sockaddr *dest_addr, socklen_t addrlen)

        函数参数

                sockfd:通信套接字

                buf:发送消息存放的空间首地址

                len:消息的长度

                flags:填 0 表示阻塞发送

                dest_addr:struct sockaddr_in

                addrlen:struct sockaddr_in 结构体大小

        函数返回值

                成功返回发送消息的长度,一个大于 0 的值,失败返回负数

        接收函数

        函数原型

                ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen)

        函数参数

                sockfd:通信套接字

                buf:接收数据存放空间的首地址

                len:接收数据的长度

                flags:填 0 表示阻塞接收

                src_addr:发送方 IP 和端口信息存放空间的首地址,需要去定义一个变量去承接发送方的 IP 和端口信息

                addrlen:发送方核心结构体的大小,需要定义一个变量,变量取地址装进来

        函数返回值

                成功返回接收到消息的长度,失败返回负数

1.4 广播

        一对多,一个发送,剩下的接收

        相较于单播

                1、多了一个套接字属性设置 setsockopt --- 让套接字可以发送广播消息

                2、发送方多了广播 IP --- 当前的 IP,前 3 个字节不变,最后一个字节为 255

                        例如:广播 IP --- 192.168.0.255

                3、接收方多了一个新的定义 --- INADDR_ANY --- 0.0.0.0

1.5 组播/多播

        相较于单播和广播,更改的内容最多

        组播需要创建和加入

        发送方:

                1、创建通信套接字

                        组播的 IP 地址 --- 224.0.0.x , x 最好不要用 1,1 比较特殊

                2、创建组播 --- setsockopt

                        需要使用组播的结构体 struct iq_mreqn --- vscode 无法跳转这个结构体

struct ip_mreqn 
{/* 多播组 IP 地址,大整数,可以用inet_pton(3) 将点分式转换为大整数 */    struct in_addr imr_multiaddr; {in_addr_t s_addr;};/* 本机 IP 地址,可以用 0.0.0.0 代替,大整数,可以用 inet_pton(3) 将点分式转换为大整数,INADDR_ANY */ struct in_addr imr_address; /* 当前使用的网络设备的索引号,ip ad sh 命令可以,查看编号,用 if_nametoindex(3) 函数也可以通过网络设备名字获取编号,名字就是 ifconfig(1) 看到的名字,如 eth0、wlan0 等 */int imr_ifindex;
}; 

        头文件

                #include <net/if.h>

        函数原型

                unsigned int if_nametoindex(const char *ifname)

        函数参数

       网卡的名字

                setsockopt 中还需要几个参数

                        IPPROTO_IP:组播的标志 --- 第二个参数

                        IP_MULTICAST_IF:发送方创建组播 --- 第三个参数

                        IP_ADD_MEMBERSHIP:接收方加入组播

                        UDP 作为一个了解 --- 要会写单播,广播,组播

        在嵌入式的应用中,我们会使用到 UDP 的应用层协议,纯粹的 UDP 用的相对较少,因为 UDP 的思想可以通过其它的传感器实现,lora、zigbee

http://www.dtcms.com/a/272652.html

相关文章:

  • 飞书AI技术体系
  • web 系统对接飞书三方登录完整步骤实战使用示例
  • 低温冷启动 高温热启动
  • OpenCV 图像进阶处理:特征提取与车牌识别深度解析
  • 醋酸镨:闪亮的稀土宝藏,掀开科技应用新篇章
  • Spring IoC 如何注入一些简单的值(比如配置文件里的字符串、数字)?
  • 【文献阅读】Depth Anything: Unleashing the Power of Large-Scale Unlabeled Data
  • MyBatis 使用教程及插件开发
  • 自动驾驶环境感知:天气数据采集与融合技术实战
  • AI-Sphere-Butler项目语音切换数字人管家形象功能老是开发不成功。
  • Oracle 数据库管理与维护实战指南(用户权限、备份恢复、性能调优)
  • 深度学习与图像处理案例 │ 基于深度学习的自动驾驶小车
  • GitHub上优秀的开源播放器项目介绍及优劣对比
  • 申请注册苹果iOS企业级开发者证书需要公司拥有什么规模条件
  • Nacos的基本功能以及使用Feign进行微服务间的通信
  • 【网络编程】 TCP 协议栈的知识汇总
  • ZW3D 二次开发-创建圆柱体
  • Qt cannot find C:\WINDOWS\TEMP\cctVBBgu: Invalid argument
  • QT5使用cmakelists引入Qt5Xlsx库并使用
  • 达梦数据库不兼容 SQL_NO_CACHE 报错解决方案
  • C++交叉编译工具链制作以及QT交叉编译环境配置
  • 生产环境CI/CD流水线构建与优化实践指南
  • 医院多部门协同构建知识库-指南库-预测模型三维网络路径研究
  • 12大产品规划工具对比:功能、价格与适用场景
  • (LeetCode 面试经典 150 题 ) 11. 盛最多水的容器 (贪心+双指针)
  • 2023 年 12 月青少年软编等考 C 语言七级真题解析
  • 2025年语言处理、大数据与人机交互国际会议(DHCI 2025)
  • QBoost 2025版:加速手机性能,提升使用体验
  • django中如何使用Django REST Framework
  • 基于SpringBoot旅游资源信息管理系统的设计与实现