C 解码数据包-广播或多播

C 解码数据包-广播或多播,c,ip,ethernet,packet-sniffers,C,Ip,Ethernet,Packet Sniffers,在查找多播和广播数据包的数据包解码后,我在创建决策逻辑方面遇到了一些困难。根据我使用wireshark阅读和观察的内容(并查看其部分来源),我发现: 广播: 0.0.0.0或更确切地说dst addr 255.255.255的特殊情况 dst addr的IG和LG位设置为1的本地广播 我无法知道数据包来自哪个子网,因此由于自定义子网,我无法确定特定的广播地址 我是否应该测试并查看dest addr是否是合法的广播地址(即猜测cidr?) 这是否足够 多播: IG位设置为1,LG位设置为0

在查找多播和广播数据包的数据包解码后,我在创建决策逻辑方面遇到了一些困难。根据我使用wireshark阅读和观察的内容(并查看其部分来源),我发现:

广播:

  • 0.0.0.0或更确切地说dst addr 255.255.255的特殊情况
  • dst addr的IG和LG位设置为1的本地广播
  • 我无法知道数据包来自哪个子网,因此由于自定义子网,我无法确定特定的广播地址
  • 我是否应该测试并查看dest addr是否是合法的广播地址(即猜测cidr?)
这是否足够

多播:

  • IG位设置为1,LG位设置为0
  • 发送到224-239子网的dst地址(第一个八位组)
到目前为止我有什么

/*
* Is packet destined for a multicast address?
*/
int is_multicast(CONNECTION temp)
{

char *save;
save = strtok(inet_ntoa(temp.ip_dst), ".");

int firstOct = 0;
firstOct = atoi(save);

if((temp.ether_dhost[0] == 1 ) && 
   (temp.ether_dhost[1] == 0 ) &&
   ((firstOct >= 224) && 
   (firstOct <= 239))) 
{
    return 1;

}

return 0;
}

/*
* Is packet destined for a broadcast address?
*/
int is_broadcast(CONNECTION temp)
{

    if ((temp.ether_dhost[0] == 0xFF) &&
        (temp.ether_dhost[1] == 0xFF) &&
        (temp.ether_dhost[2] == 0xFF) &&
        (temp.ether_dhost[3] == 0xFF) &&
        (temp.ether_dhost[4] == 0xFF) &&
        (temp.ether_dhost[5] == 0xFF)) {
        return 1;   // DHCP or ARP 
    } else if ((temp.ether_dhost[0] == 0xFF) &&
           (temp.ether_dhost[1] == 0xFF))
        && (temp.ether_dhost[2] != 0xFF) {
        return 1;   // Other local broadcast
    }

    return 0;
}
/*
*数据包的目的地是多播地址吗?
*/
int是_多播(连接温度)
{
字符*保存;
save=strtok(inet_ntoa(临时ip_dst)”;
int firstOct=0;
firstOct=atoi(保存);
如果((温度乙醚成本[0]==1)和
(温度乙醚成本[1]==0)&&
((10月1日>=224)和

(firstOct在IPv4的情况下,对于检查多播,第一个octect的测试应该足够了

(224 <= first octect <= 239)

(224)您是对仅IPv4的解决方案感兴趣还是对IPv6感兴趣?@sarnold我目前只在寻找IPv4解决方案。我只是在玩弄多播代码-稍后将更新。其他人的答案在上面-这应该可以解决已知的多播和广播。请注意,您无法了解其他broadc不知道子网的ast地址-您可以根据标准网络地址类进行猜测,但这最终是猜测。