openwrt之應用組播multicast發送接收

組播基本介紹

根據以上介紹 , 我們寫出組播接收程序! 

應用背景

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 接口! 用於定向路由網絡組播數據!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章