【问题标题】:C function to determine if IP address is multicast addressC函数判断IP地址是否为多播地址
【发布时间】:2014-03-27 17:47:59
【问题描述】:

如果用户输入一些 IP 地址,如“239.4.4.4”,我如何使用 linux C 中可用的任何功能确定该 IP 地址是多播?

【问题讨论】:

    标签: c linux sockets


    【解决方案1】:

    IPv4 多播地址由最高有效位 1110 定义,因此:

    1. 如果 IP 地址存储为 32 位 unsigned 变量,则对变量应用 >> 28,然后检查结果是否为 14 (1110),如 @ 987654325@.

    2. 如果 IP 地址存储为 4 个无符号字符的元组,则检查第一个 (MSB) 是否介于 224 和 239 之间,包括在内。

    【讨论】:

      【解决方案2】:

      组播地址范围从 224.0.0.0 到 239.255.255.255.http://en.wikipedia.org/wiki/Multicast_address

      所以你应该检查地址是否在范围内就足够了。

      【讨论】:

        【解决方案3】:
        bool isMulticastAddress(in_addr_t s_addr)
        {
            //in_addr_t stored in network order
            uint32_t address = ntohl(s_addr);
        
            return (address & 0xF0000000) == 0xE0000000;
        }
        

        【讨论】:

        • 也许你可以多解释一下你的答案。
        • 欢迎来到 Stack Overflow!虽然这段代码 sn-p 可以解决问题,但including an explanation 确实有助于提高帖子的质量。请记住,您正在为将来的读者回答问题,而这些人可能不知道您的代码建议的原因。 - From review
        • 有效的多播 IPv4 地址介于 224.0.0.0 和 239.255.255.255 之间。检查前导字节以确保它在 224 和 239 之间(含)是显而易见的答案。但认识到 224 = 0xE0 和 239 = 0xEF,检查第一个半字节与 0xE 就足够了。
        【解决方案4】:

        您不需要函数来确定地址是否为多播地址,只需查看其范围:如果第一个字节是between 224 and 239(包含),则它是 D 类中的多播地址。

        IPv4 多播地址由 1110 的前导地址位定义,起源于早期 Internet 的有类网络设计,当时这组地址被指定为 D 类。该组的无类域间路由 (CIDR) 前缀是 224.0.0.0/4。该组包括从 224.0.0.0 到 239.255.255.255 的地址

        当然,IPv6 有自己的方案,但多播地址以ff00:: 开头。无论如何,请参阅维基百科文章。

        哦,最后,如果您希望我们为您提供在 C 中检查的方法,您需要提供更多关于您的 IP 地址表示形式的详细信息。它是一个 4 字节的结构吗?它是一个四字节整数吗?是字符数组吗?

        【讨论】:

        • RFC 引用自 wikipedia,本文基于这些。当我对这篇文章有任何疑问时,我并不是在参考维基百科,但这里我在文章中引用的信息是准确的,所以我认为没有理由不引用它们。
        【解决方案5】:

        在 Linux 中,您可以在 in.h 中使用 IN_MULTICAST()defined。例如,

        bool a = IN_MULTICAST(ntohl(inet_addr("239.4.4.4")));
        

        【讨论】:

          【解决方案6】:
          /**********************************************************************************************************************
           * Checks if specified IP is multicast IP. Multicast IP ranges from 224.0.0.0 to 239.255.255.255.
           *
           * Returns 0 if specified IP is not multicast IP, else non-zero.
           *
           * Parameters:
           *      ip                          IP to check for multicast IP, stored in network byte-order.
           *********************************************************************************************************************/
          int net_ip__is_multicast_ip(in_addr_t ip){
              char *ip_str = (char *) &ip;
          
              int i = ip_str[0] & 0xFF;
          
              // we will check only first byte of IP
              // and if it from 224 to 239, then it can
              // represent multicast IP.
              if(i >=  224 && i <= 239){
                  return 1;
              }
          
              return 0;
          }
          

          【讨论】:

          • 您可以用return (ip_str[0] &amp; 0xF0) == 0xE0;替换条件。由于 ipaddr_t 是 uint32_t 整个主体可能只是 return (ip &amp; 0xF0000000) == 0xE0000000; - 这也适用于宏。
          • IP 地址不是按照标准存储为大端序吗?因此,(ip &amp; 0xF0000000) 不会在 little-endian 系统上测试错误的字节吗?
          • 是的,这就是为什么我将指针指向 char*,而 ip_str[0] 是大端形式的 MSByte。
          猜你喜欢
          • 2013-11-07
          • 2013-07-30
          • 2010-12-02
          • 2011-02-05
          • 1970-01-01
          • 2022-01-12
          • 1970-01-01
          • 2011-08-01
          • 2011-03-26
          相关资源
          最近更新 更多