CH395 组播应用补充
基于CH395的组播请求(IGMP) - sw2222 - 博客园
观看本文前以及想要基于CH395实现组播应用,请首先通读上面链接文档(内附参考例程)!!!
本文仅是对上面链接文档内容的一些补充说明,本文主要解决3个问题:
1.加入组播我们用到IGMP协议,为什么按照这样的格式去组包?
2.想入加入多个组播,如何操作?
3.需要离组,如果操作?
先了解下具体需要用到的具体协议:
加入组包我们会用到IGMP协议。IGMPv3分为查询报文和成员报告报文,加入组播用到的是成员报告报文。
报文格式:
第一张表:
类型Type = 0x22代表此报文为成员报告报文;
Checksum为校验;
Number of Group Records:组记录数量;
Group Record[x]:具体组记录;
第二张表:
其中,Group Record字段内容格式:
Record Yype:组播消息类型(具体类型可查阅相关资料,此处不多赘述)
Aux Data Len:辅助数据长度,IGMPv3协议无任何辅助数据,所以此字段必须为0
Number of Sources:表明组记录中有多少源地址,一般为0即可
Multicast Address:表明该组记录从属的组播ip地址
Source Address:单播地址
报文格式了解清楚后,回答上面提出的问题:
1.比如加入组播224.100.100.112,那么通过工作在ipraw模式下的socket发出的数据为:
1 UINT8 MyBuffer[16] = { 2 0x22,0x00, 3 0x95,0x29, 4 0x00,0x00,0x00,0x01, 5 0x04,0x00,0x00,0x00, 6 0xe0,0x64,0x64,0x70,//224.100.100.112 7 };
//调用send函数用ipRaw模式的socket将这一包数据发出即可加入组播:CH395SendData(sock_id,MyBuffer,sizeof(MyBuffer));
为何这样组包?一切都是根据协议要求来制定数据包:
上面buf对应的协议内容:
wireshark抓包(加入组播):
2.如何加入多个组播?两种方式:
①定义buf1 、buf2、buf3,调用send分别发出这三个buf即可实现加入三个不同组播,参考上面。
②将三个buf根据协议格式封装成一个buf,如下,实现发一个buf即可加入三个组播,只需调用send函数发送MyBuffer这一个数组即可。
1 UINT8 MyBuffer[32] = { 2 0x22,0x00, 3 0x02,0x89, 4 0x00,0x00,0x00,0x03, 5 6 0x04,0x00,0x00,0x00, 7 0xe0,0x64,0x65,0x6D,//224.100.100.109 8 9 0x04,0x00,0x00,0x00, 10 0xe0,0x64,0x64,0x70,//224.100.100.112 11 12 0x04,0x00,0x00,0x00, 13 0xe0,0x64,0x64,0x67,//224.100.100.103 14 };
标红的两个八位,由协议解析可以看到是表明了有多少个组记录,此处改为3表示有三个组记录,后面再加上具体的3个组信息即可。
wireshark抓包(加入多个组播):
3.离组
1 UINT8 MyBuffer112[16] = { 2 0x22,0x00, 3 0x96,0x29, 4 0x00,0x00,0x00,0x01, 5 0x03,0x00,0x00,0x00, 6 0xe0,0x64,0x64,0x70,//224.100.100.112
和第一个问题的buf主要区别就是红色的字节改为了0x03,具体原因可以查询相关协议文档,此处不多赘述。
wireshark抓包(离开某组播):