2016-02-10 45 views
0

对于在struct sockaddr_in6数据类型中表示的给定IPv6地址,我想知道该地址是否在多播address range中。过滤掉IPv6多播地址范围

举例来说,我希望有一个功能is_ipv6_multicast()的作品如下

struct sockaddr_in6* sa6; 
... 
if (is_ipv6_multicast(sa6)) { 
    // do one thing 
} else { 
    // do another 
} 

谁能帮助我?

+0

正如@dbush指出的那样,它很容易确定它是否是多播地址。更难的部分是根据标志和范围确定什么样的组播。一些多播地址是无效的,这取决于如何设置标志(例如,如果设置了R标志,则必须设置P和T标志,并且如果其中一个或两个都未设置,则它是无效的多播地址) 。 –

回答

3

IPv6 multicast addresses在第一个字节中的值为0xFF。所以你可以这样测试:

int is_ipv6_multicast(struct sockaddr_in6* sa6) { 
    return (sa6->sin6_addr.s6_addr[0] == 0xff); 
}