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