多播(multicast)

2024-11-02  本文已影响0人  锈色的栅栏

数据的收发只能在同一分组中进行

特点

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;
  }

上一篇 下一篇

猜你喜欢

热点阅读