17 multicast示例

本文介绍组播通信的基本原理,包括组播IP地址范围与MAC地址格式,并通过具体代码示例展示了如何使用C语言实现服务器向组播组发送数据及客户端接收这些数据的过程。

1、组播IP地址
     224.0.0.0 ~ 239.255.255.255
     
     组播以太网地址(MAC地址)
     开头高三个字节总是 01:00:5e


2、组播分为两部分:
     a、组播数据流 ,目的MAC地址为01:00:5e:xx:xx:xx   
224.25.25.25 的mac地址为01:00:5e:19:19:19


     b、组播控制流(IGMP v1,v2,v3)
分三种报文:report(join),leave,query

3. server往组发送信息


#include "socket_includes.h"
#include <errno.h>

int main(int argc, char*argv)
{
    int sockfd;
    struct sockaddr_in mcast_addr;   
	char buf[100] = MCAST_DATA;
	int on = 1;
	int ret;
	
    sockfd = socket(AF_INET, SOCK_DGRAM, 0);        
    if (sockfd == -1)
    {
        perror("socket()");
        return -1;
    }
   
	if((ret = setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on))) < 0){
	    perror("Error, set socket reuse addr failed");  
	    return -1;
	}
    memset(&mcast_addr, 0, sizeof(mcast_addr));
    mcast_addr.sin_family = AF_INET;              
    mcast_addr.sin_addr.s_addr = inet_addr(MCAST_ADDR);
    mcast_addr.sin_port = htons(MCAST_PORT);      
   
                                                  
    while(1) {
        int n = sendto(sockfd, buf, strlen(buf), 0,
					(struct sockaddr*)&mcast_addr,sizeof(mcast_addr));
        if( n < 0){
            perror("sendto:");
            return -1;
        }      
       
        sleep(MCAST_INTERVAL); 
    }
   
    return 0;
}

4. client接收信息

#include "socket_includes.h"






int main(int argc, char*argv[])
{  
    int sockfd;                                     
    struct sockaddr_in local_addr;          
    int err = -1;
	int ret;
	int on = 1;
    int times = 0;
    int addr_len = 0;
    char buff[BUFF_SIZE];
    int n = 0;
    int loop = 1;
   
    sockfd = socket(AF_INET, SOCK_DGRAM, 0);   
    if (sockfd == -1)
    {
        perror("socket()");
        return -1;
    }  
	if((ret = setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on))) < 0){
	    perror("Error, set socket reuse addr failed");  
	    return -1;
	}
 	                                       
    memset(&local_addr, 0, sizeof(local_addr));
    local_addr.sin_family = AF_INET;
    local_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    local_addr.sin_port = htons(MCAST_PORT);
   
                                           
    err = bind(sockfd,(struct sockaddr*)&local_addr, sizeof(local_addr)) ;
    if(err < 0)
    {
        perror("bind()");
        return -1;
    }
   
                                         
    err = setsockopt(sockfd,IPPROTO_IP, IP_MULTICAST_LOOP, &loop, sizeof(loop));
    if(err < 0){
        perror("setsockopt():IP_MULTICAST_LOOP");
        return -1;
    }
   
    struct ip_mreq mreq;                                  
    mreq.imr_multiaddr.s_addr = inet_addr(MCAST_ADDR); 
    mreq.imr_interface.s_addr = htonl(INADDR_ANY); 
                                                  
    err = setsockopt(sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq));
    if (err < 0){
        perror("setsockopt():IP_ADD_MEMBERSHIP");
        return -1;
    }
   
                                  
    for(times = 0;times<5;times++){
        addr_len = sizeof(local_addr);
        memset(buff, 0, BUFF_SIZE);               
                                              
        n = recvfrom(sockfd, buff, BUFF_SIZE, 0,(struct sockaddr*)&local_addr,&addr_len);
        if(n == -1){
            perror("recvfrom()");
			break;
        }
                                                   
        printf("Recv %dst message from server:%s\n", times, buff);
        sleep(MCAST_INTERVAL);
    }
   
                                              
    err = setsockopt(sockfd, IPPROTO_IP, IP_DROP_MEMBERSHIP,&mreq, sizeof(mreq));
       
    close(sockfd);
    return 0;
}



<think>好的,用户想了解关于多播(multicast)在网络编程中的相关信息。首先,我需要回顾多播的基本概念。多播是一种网络通信方式,允许单个发送者向多个接收者同时发送数据,这比单播(unicast)广播(broadcast)更高效。根据引用[^1],多播路由在数据报互联网络扩展局域网中有应用,特别是在组播环境中优化数据传输。 接下来,用户可能想知道多播在网络层的工作原理。多播使用特定的IP地址范围,比如IPv4中的224.0.0.0到239.255.255.255,以及IPv6中的FF00::/8。这些地址标识多播组,路由器负责将数据包转发给加入该组的成员。引用提到多播路由协议如PIM(Protocol Independent MulticastIGMP(Internet Group Management Protocol)是关键,用于管理组成员路由选择。 然后是关于编程中的多播实现。这里需要区分网络编程中的不同层次。在应用层,可以使用Socket编程实现多播。例如,在Python中,使用socket库设置套接字选项来加入多播组。引用[^3]提到控制器可以识别标签类型并执行基本操作,这可能与处理多播数据流有关。代码示例需要正确设置TTL、绑定端口加入多播组,同时处理接收的数据。 另外,用户可能关心多播的优缺点。优点包括带宽节省减少发送者负载,缺点涉及网络配置复杂性安全风险。应用场景如视频会议实时数据分发需要提及,这些场景中多播能有效减少冗余流量。 最后,生成相关问题时要覆盖网络基础、协议、编程实现、对比分析以及实际应用,确保问题能引导用户深入理解多播的不同方面。需要确保引用正确,比如引用的相关内容,增强回答的可信度。</think>### 多播(Multicast)在网络与编程中的实现 #### 1. **多播的网络基础** 多播是一种网络通信模式,允许单个发送者向一组接收者(多播组)高效传输数据包,适用于一对多或多对多的场景(如视频会议、实时数据分发)。 - **IP多播地址范围**: - IPv4:$224.0.0.0 \sim 239.255.255.255$ - IPv6:$FF00::/8$ - **关键协议**: - **IGMP**(Internet Group Management Protocol):管理主机与路由器之间的组成员关系。 - **PIM**(Protocol Independent Multicast):构建多播分发树,优化路由路径。 #### 2. **多播编程实现** 在编程中,多播通常通过Socket编程实现,需设置套接字选项以加入多播组。 **Python示例**: ```python import socket # 创建UDP套接字 sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # 绑定到多播地址端口 group = ('224.1.1.1', 5000) sock.bind(group) # 加入多播组 mreq = socket.inet_aton(group[0]) + socket.inet_aton('0.0.0.0') sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq) # 接收数据 while True: data, addr = sock.recvfrom(1024) print(f"Received: {data.decode()} from {addr}") ``` #### 3. **多播的优缺点** - **优点**: - 节省带宽,避免单播重复传输。 - 减少发送者负载(如流媒体场景)。 - **缺点**: - 网络设备需支持多播路由(如配置PIM)。 - 存在安全风险(未加密数据可能被监听)。 #### 4. **应用场景** - 实时流媒体(如IPTV)。 - 分布式系统状态同步。 - 物联网设备群控(如批量配置更新)。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值