广播 broadcast
-
同时发给局域网中的所有主机,称为广播
-
只有用户数据报(使用UDP协议)套接字才能广播
-
广播地址
以192.168.1.0网段为例,最大的主机地址192.168.1.255代表该网段的广播地址 发送到该地址的数据报被所有的主机接收
发送广播消息:
- socket(); 创建用户数据报UDP套接字
- struct sockaddr_in addr;
- setsockopt();//设置套接字属性,开广播权限
- sendto();//不开权限,ERROR!
接收广播消息:
- socket();
- struct sockaddr_in addr;
- bind(); "0"地址 或者 广播地址(只能收广播消息)
- recvfrom();
相关函数 setsockopt()
其他函数使用介绍可以看上一篇文章 – TCP/UDP
/* 获取/设置 套接字属性 */
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
int getsockopt(int sockfd, int level, int optname,
void *optval, socklen_t *optlen);
int setsockopt(int sockfd, int level, int optname,
const void *optval, socklen_t optlen);
参数:
sockfd 套接字文件描述符
level 属性设置表(选项级别) 例:SOL_SOCKET
更多参加socket(7)
optname 选项名,例:SO_BROADCAST
更多参见ip(7)
optval 存放选项值的缓冲区的地址
optlen 缓冲区长度
返回值:
成功返回 0,失败返回 -1
组播 Multicast
- 组播,多播。只有加入某个多播组的主机才能收到数据
- 多播方式既可以发给多个主机,又能避免像广播那样带来过多的负载。
D类网络地址 – 组播地址
- 不分网络地址和主机地址,第一字前4位固定1110
- 224.0.0.1 - 239.255.255.255
组播发送:
- socket(); //创建用户数据报套接字
- struct sockaddr_in addr; //指定组播地址
- sendto(); //发送数据包
组播接收:
- socket(); 创建用户数据报套接字
- struct sockaddr_in addr;
- struct ip_mreqn mreq; // 组播地址 + “0”地址
- setsockopt(); //加入多播组
- bind(); //绑定ip地址和端口
- recvfrom();
相关函数
man 7 ip 查看man手册ip(7)
struct ip_mreqn
{
struct in_addr imr_multiaddr; /* IP多播组地址 */
struct in_addr imr_address; /* 本地接口的IP地址 */
int imr_ifindex; /* 接口索引 ip_mreq 无该字段*/
};
//加入到多播组
setsockopt(sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreqn, sizeof(mreqn));