linux组播命令 linux组播设置( 三 )


unsolicit_count是当一个接口新加入到一个多播组时,发送主动报告的次数,值赋为
IGMP_Unsolicited_Report_Count(缺省值为2) 。loaded也是一个标志,当该接口上的该多播组被加入时 , 需要通知硬件过
滤器,通知完成即置该标志为1,否则为0 。
该结构体比较复杂 , 先看通过IP_ADD_MEMBERSHIP命令字把一个socket加入到一个新的多播组,会使struct in_device的mc_list中增加一个什么样的节点 。下面是生成的节点的情况:
struct ip_mc_list{
.interface = in_dev;
.multiaddr = 多播组地址;
.source = NULL;//源过滤列表为空 。
.tomb = NULL;
.sfmode = MCAST_EXCLUDE;//EXCLUDE模式,即不过滤任何源 。
.sfcount[MCAST_EXCLUDE] = 1;
.sfcount[MCAST_INCLUDE] = 0;//即该节点上该多播组有一个socket加入,过滤模式为EXCLUDE 。
.users = 1;//有一个用户 。
.refcnt = 1; //引用计数为1
.tm_running = 0;
.unsolicit_count = 2;
... ...
}
新生成的节点加入到mc_list链表中后,要通知网络设备接口的硬件,以使它的过滤机制可以接收进该多播组的数据报,同时也要通知多播路由器 。
首先要把多播地址映射成以太网地址,映射规则是把多播IP地址的低23位放到以太网多播地址01-00-5E-00-00-00(16进制)的低23位 。
因为一个IP组地址有28位有效位(除去高位的1110),所以有可能出现多个组地址被映射成同一个以太网多播地址,具体实现见
ip_eth_mc_map 。然后把这个mac地址加到硬件的过滤机制中 。
具体的实现在函数dev_mc_add中 。代表网络设备接口的结构体struct net_device也有一个成员mc_list,它是一个结构体struct dev_mc_list的链表,该结构体的定义如下:
struct dev_mc_list
{
struct dev_mc_list*next;
__u8dmi_addr[MAX_ADDR_LEN];
unsigned chardmi_addrlen;
intdmi_users;
intdmi_gusers;
};
next指向链表下一个节点,dmi_addr是多播mac地址,dmi_addrlen为多播mac地址的长度,dmi_users是在节点被重复到加
入到设备上的次数,struct
net_device还有一个成员mc_count,用于记录链表中节点的数量 。dev_mc_add创建一个新的struct
dev_mc_list节点,加入到链表中,并通过调用网络设备接口的成员函数set_multicast_list来启用设备的过滤机制 。
最后一步发送主动成员报告,这里,首先忽略IGMPv1和IGMPv2存在的情况 。如果要加入的多播组是
IGMP_ALL_HOSTS(224.0.0.1),则不需要发送成员报告 。否则启用定时器struct
in_device-mr_ifc_timer(接口状态改变定时器),该定时器在设备初始化的时候被建立,其超时处理函数是
igmp_ifc_timer_expire,它发送一个IGMPv3的报告,然后再次启用定时器 。也就是说,第一个主动成员报告立即发出 , 然后在一个0
到IGMP_Unsolicited_Report_Interval(缺省为10秒)之间的一个时间后 , 发出第二个主动成员报告 , 连续发出
IGMP_Unsolicited_Report_Count(缺省值为2)个 。
测试环境中要加入的多播组是224.0.1.1,发出的IGMPv3报告如下:
数据含义
22第3版成员关系报告
008bit保留,必须为0
f8 fc校验和
00 0016bit保留,必须为0
00 01组记录的数量,为1
下面为一条组记录:
04类型为CHANGE_TO_EXCLUDE_MODE,改变到EXCLUDE过滤模式
00辅助数据长度
00 00源地址的数量
e0 00 01 01组地址224.0.1.1
如何实现Linux下的VLC的组播控制vlc 命令行就能控制播放,你写个程序运行这些命令就行了 。
我记得 vlc 也有这种控制软件 , 你可以找找 。
Linux里面 netstat -ntlp命令作用是什么?netstat命令是一个监控TCP/IP网络的非常有用的工具,它可以显示路由表、实际的网络连接以及每一个网络接口设备的状态信息 。

推荐阅读