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抓包(离开某组播):

 

posted on 2025-01-04 10:33  Lqqq123  阅读(1)  评论(0编辑  收藏  举报

导航