C函数确定IP地址是否是多播地址

时间:2014-02-25 13:13:00

标签: c linux sockets

如果用户输入了某些IP地址,如“239.4.4.4”,如何在Linux C中使用任何功能确定此IP地址是多播的?

6 个答案:

答案 0 :(得分:5)

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

  1. 如果IP地址存储为32位无符号变量,请将>> 28应用于变量,然后检查结果是否为14({{1 }}),如1110

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

答案 1 :(得分: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;
}

答案 2 :(得分:2)

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

  

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

的地址

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

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

答案 3 :(得分:2)

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

因此,您应该检查地址是否在范围内。

答案 4 :(得分:1)

使用Linux,您可以使用IN_MULTICAST()中的in.hdefined。例如,

if (IN_MULTICAST(ntohl(inet_addr("239.4.4.4)))) {}

答案 5 :(得分:0)

/**********************************************************************************************************************
 * 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;
}