openwrt之应用组播multicast发送接收

本文介绍了如何使用C语言实现一个组播接收程序,包括套接字的创建、配置及加入多播组的过程。同时探讨了在网络调试过程中遇到的问题及其解决办法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

组播基本介绍

根据以上介绍 , 我们写出组播接收程序! 

应用背景

wifi board 连接上级路由器,而后通过pc网络调试助手向其发送组播数据 ! 组播地址ip 定位: 224.0.1.100, 在上面的理论介绍中,该地址为:预留多播地址:在224.0.1.0~238.255.255.255之间,可用于全球范围(如Internet)或网络协议

int multicast_server_init(void)
{
	int err = -1;
	char buf[100]={0};

	struct sockaddr_in local_addr;              /*本地地址*/
	struct sockaddr_in peer_addr; 

	

	struct stConfig *config = config_list();

	ULOG_INFO("WIFI option : %s,%d\n",config->addr,config->port);



	multicast_server_fd = socket(AF_INET, SOCK_DGRAM, 0);     /*建立套接字*/
	if (multicast_server_fd == -1)
	{
		perror("socket()");
		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);
	local_addr.sin_port = htons(config->port);
	
	/*设置回环许可*/
	int loop = 1;
	err = setsockopt(multicast_server_fd,IPPROTO_IP, IP_MULTICAST_LOOP,&loop, sizeof(loop));
	if(err < 0)
	{
		perror("setsockopt():IP_MULTICAST_LOOP");
		close(multicast_server_fd);
		return -3;
	}
	
    bool bReuseaddr = true;
	err = setsockopt(multicast_server_fd,SOL_SOCKET, SO_REUSEADDR,&bReuseaddr, &bReuseaddr);
	if(err < 0)
	{
		perror("setsockopt():SOL_REUSEADDR");
		close(multicast_server_fd);
		return -3;
	}

	/*绑定socket*/
	err = bind(multicast_server_fd,(struct sockaddr*)&local_addr, sizeof(local_addr)) ;
	if(err < 0)
	{
		perror("bind()");
		close(multicast_server_fd);
		return -2;
	}
	
	struct ip_mreq mreq;                                    /*加入多播组*/
	//mreq.imr_multiaddr.s_addr = inet_addr(MCAST_ADDR); /*多播地址*/
	mreq.imr_multiaddr.s_addr = inet_addr(config->addr); /*多播地址*/
	mreq.imr_interface.s_addr = htonl(INADDR_ANY); /*网络接口为默认*/

membership:
    memset(buf,0x0,100);
    //通过wlan0-1路由数据,允许所有组播数据
	sprintf(buf,"route add -net 224.0.1.100 netmask 255.255.255.255 wlan0-1");
	system(buf);

	/*将本机加入多播组*/
	err = setsockopt(multicast_server_fd, IPPROTO_IP, IP_ADD_MEMBERSHIP,&mreq, sizeof
			(mreq));
	if (err < 0)
	{
		perror("setsockopt():IP_ADD_MEMBERSHIP");
		//return -4;
		sleep(2);
		goto membership;
	}

	return 0;
}

但该程序运行后,并不能友好的接收数据;  而后加入/usr/sbin/igmpproxy /var/etc/igmpproxy.conf , 路由组播接收数据稳定, 但是同时有两个客户端向其发送数据,则有一方不能正常通信, 通过重新初始化程序方能通信!

root@Leedarson:~# cat /etc/config/igmpproxy 
config igmpproxy
	option quickleave 1

config phyint wan
	option network wwan
	option direction upstream
	list altnet 192.168.1.0/24

config phyint lan
	option network lan
	option direction downstream

其中,upstream 、 downstream 在我的项目中对应wlan0-1(station mode), br-lan 接口! 用于定向路由网络组播数据!

对不起,您提到的参考资料主要讲解了如何使用Vmware搭建软路由以及连接OpenWrt网络设置。关于OpenWrt搭建的具体步骤并未在这些资料中详细说明。通常,OpenWrt作为轻量级路由器操作系统,支持多种功能,包括IP转发、DHCP服务器等,但直接搭建可能涉及到高级网络配置,如IGMP(SIMultaneous Multicast Listening Protocol)的支持和配置。 在网络环境中主要用于多对多通信,例如视频流、实时广等。如果要在OpenWrt上搭建,一般需要以下几个步骤(请注意这并非直接来自提供的参考资料): 1. **安装必要的软件包**: 在OpenWrt的终端中运行命令以安装Multicast工具包,比如`opkg install kmod-igmpv3 multicast-ng`。 2. **启用和配置IGMP**: 启用IGMP协议并可能需要配置特定的接口和地址(`/etc/config/multicast` 或 `/etc/firewall.user`). 3. **加入**: 可能需要通过命令行工具如`igmptool join`来指定接收。 4. **防火墙配置**: 确保防火墙允许进入的流量,通常是添加相应的端口转发规则。 5. **测试**: 使用专门的测试工具验证流量能否正常到达。 由于这些操作涉及更具体的网络配置,建议查阅OpenWrt官方文档或相关的技术论坛以获取详细的指导。如果你需要了解如何在OpenWrt中进行这些高级网络配置,可能需要额外的参考资料[^4]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值