多播(multicast)
数据的收发只能在同一分组中进行
特点
1.多播地址标识一组接口
2.多播可以用于广域网
3.IPv4中,多播是可选的
多播地址
D类地址: 前4位为1110
1110 0000
224.0.0.1 ~ 239.255.255.254
多播地址主要分为三类:局部连接多播地址、预留多播地址和管理权限多播地址。
局部连接多播地址:范围从224.0.0.0到224.0.0.255。这些地址通常用于路由协议和其他特定用途,路由器不会转发属于此范围的IP包12。
预留多播地址:范围从224.0.1.0到238.255.255.255。这些地址可用于全球范围,例如在Internet或网络协议中使用12。
管理权限多播地址:范围从239.0.0.0到239.255.255.255。这些地址通常供组织内部使用,类似于私有IP地址,不能用于Internet,可以限制多播范围
多播地址映射 01 00 5e 0固定
只能将自己的主机的ip加入多播组
基于mac地址不完备硬件过滤 基于IP地址完备软件过滤
struct in_addr{
in_addr_t s_addr;
}struct ip_mreq{
struct in_addr imr_multiaddr; //多播组的IP
struct in_addr imr_interface; //将要添加到多播组的IP
}
224.0.0.1--该子网内所有的系统组。
224.0.0.2--该子网内所有的路由器。
224.0.1.1--网络实现协议NTP专用IP。
224.0.0.9--RIPv2专用IP
224.0.0.0-----224.0.0.255是有特殊用途的保留地址,
239.0.0.0-----239.255.255.255是私网地址,
224.0.1.0-----238.255.255.255是用于公网上的组播地址。
示例代码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<errno.h>
#include<pthread.h>
#include<arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>void sys_err(const char *str)
{
perror(str);
exit(1);
}
int main(int argc,char *argv[])
{
int sockfd = socket(AF_INET,SOCK_DGRAM,0);
struct sockaddr_in my_addr; bzero(&my_addr,sizeof(my_addr));
my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(8000);
my_addr.sin_addr.s_addr = INADDR_ANY;
bind(sockfd,(struct sockaddr *)&my_addr,sizeof(my_addr));
struct ip_mreq mq;
mq.imr_multiaddr.s_addr = inet_addr("224.0.0.1"); //多播组的地址
mq.imr_interface.s_addr = INADDR_ANY; setsockopt(sockfd,IPPROTO_IP,IP_ADD_MEMBERSHIP,&mq,sizeof(mq));//加入多播组while(1){
unsigned char buf[1500] = "";
recvfrom(sockfd, buf,sizeof(buf),0,NULL,NULL);
printf("%s\n",buf);
}
close(sockfd);
return 0;
}