2014-02-25 63 views

回答

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; 
} 
+1

您可以用'return(ip_str [0]&0xF0)== 0xE0;'替换条件。 因为ipaddr_t是uint32_t,所以整个机构可能只是'return(ip&0xF0000000)== 0xE0000000;' - 这对于宏也是可用的。 – zany

1

你并不需要一个函数来确定地址是否是多播一个,只是看它的范围:如果第一个字节是between 224 and 239(含税),这是一个多播地址,内部类D.

IPv4多播地址由1110的起始地址位定义,源自早期因特网的有类网络设计,当该组地址被指定为类D.该组的无类别域间路由(CIDR)前缀是224.0.0.0/4。该集团包括从224.0.0.0地址到239.255.255.255

当然,IPv6有自己的计划,但多播地址开始ff00::。无论如何,请参阅维基百科的文章。最后,如果你想让我们给你一些检查C的方法,你需要给出更多关于你的IP地址表示的细节。它是一个4字节的结构?它是一个四字节的整数吗?这是一组字符吗?

+0

RFC从维基百科引用,文章基于这些。当我对这篇文章有任何疑问时,我并没有提及维基百科,但这里我在文章中提到的信息是确切的,所以我没有理由不引用它们。 – zmo

4

IPv4多点地址由最显著位1110定义的,因此:

  1. 如果IP地址被存储为32位无符号变量,施加>> 28的变量,然后检查结果是141110),如isMulti = ((address >> 28) == 14);

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

1
bool isMulticastAddress(in_addr_t s_addr) 
{ 
    //in_addr_t stored in network order 
    uint32_t address = ntohl(s_addr); 

    return (address & 0xF0000000) == 0xE0000000; 
} 
+1

也许你可以更多地解释你的答案。 – Eria

+0

欢迎来到Stack Overflow!尽管这段代码可以解决这个问题,但[包括解释](http://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers)确实有助于提高帖子的质量。请记住,您将来会为读者回答问题,而这些人可能不知道您的代码建议的原因。 - [来自评论](https:// stackoverflow。com/review/low-quality-posts/11679944) – Ferrybig

+0

Idk我认为这很简单... – Qix

0

使用Linux,你可以使用in.hIN_MULTICAST()defined。例如,

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