linux网络编程4
24.9.20学习目录
- 一.UDP(续)
- 1.广播
- 广播流程
- 2.多播
- 多播流程
一.UDP(续)
1.广播
由一台主机向该主机所在子网内的所有主机发送数据的方式;
广播只能用UDP或原始IP实现,不能使用TCP;
其作用是将单个服务器与多个客户主机通信时减少分组流通;
用到广播的协议如下:
- 地址解析协议(ARP)
- 动态主机配置协议(DHCP)
- 网络时间协议(NTP)
特点:
- 处于同一子网的所有主机都必须处理数据
- UDP数据包会沿协议栈向上一直到UDP层
- 运行音频等高速率工作的应用,会带来较大的负担
- 局限于局域网内使用
- 当数据传入到链路层时不会进行阻拦,只到传输到网络层时,查看当前端口是否在进行,如果没有则舍弃
- 在IPv6中是不可以选的,IPv4可以选用
广播流程
发送者:
- 创建套接字
- 设置为允许发送广播权限setsockopt()
- 向广播地址发送数据sendto()
//设置套接字的属性
int setsockopt(int sockfd,int level,int optname,const void *optval,socklen_t optlen);
level:SOL_SOCKET(套接字层次)
optname:SO_BROADCAST(允许发送广播数据包)、SO_RCVBUF(接收缓冲区大小)、SO_SNDBUF(发送缓冲区大小)
接收者:
- 创建套接字
- 将套接字与广播的信息结构体绑定
- 接收数据recvfrom()
2.多播
数据的收发仅仅在同一分组中运行;
其又称为组播;
在IPv4中其地址为D类地址
特点:
- 多播地址标示一组接口
- 多播可以用于广域网使用
- 在IPv4中多播是可选的
- 相对于广播,多播具有可控性
多播使用的结构体:
struct in_addr
{
in_addr_t s_addr;
};
struct ip_mreq
{
struct in_addr imr_multiaddr;//多播组IP
struct in_addr imr_interface;//将要添加到多播组的IP
};
多播流程
发送者:
- 创建套接字
- 发送数据
接收者:
- 创建套接字
- 设置加入多播组setsocketopt()
- 套接字的绑定
- 接收数据
int setsockopt(int sockfd,int level,int optname,const void *optval,socklen_t optlen);
level:IPPROTO_IP
optname:IP_ADD_MEMBERSHIP(加入多播组)、IP_DROP_MEMBERSHIP(离开多播组)
optval:多播的结构体