【发布时间】:2014-03-27 17:47:59
【问题描述】:
如果用户输入一些 IP 地址,如“239.4.4.4”,我如何使用 linux C 中可用的任何功能确定该 IP 地址是多播?
【问题讨论】:
如果用户输入一些 IP 地址,如“239.4.4.4”,我如何使用 linux C 中可用的任何功能确定该 IP 地址是多播?
【问题讨论】:
IPv4 多播地址由最高有效位 1110 定义,因此:
如果 IP 地址存储为 32 位 unsigned 变量,则对变量应用 >> 28,然后检查结果是否为 14 (1110),如 @ 987654325@.
如果 IP 地址存储为 4 个无符号字符的元组,则检查第一个 (MSB) 是否介于 224 和 239 之间,包括在内。
【讨论】:
组播地址范围从 224.0.0.0 到 239.255.255.255.http://en.wikipedia.org/wiki/Multicast_address
所以你应该检查地址是否在范围内就足够了。
【讨论】:
bool isMulticastAddress(in_addr_t s_addr)
{
//in_addr_t stored in network order
uint32_t address = ntohl(s_addr);
return (address & 0xF0000000) == 0xE0000000;
}
【讨论】:
您不需要函数来确定地址是否为多播地址,只需查看其范围:如果第一个字节是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 字节的结构吗?它是一个四字节整数吗?是字符数组吗?
【讨论】:
在 Linux 中,您可以在 in.h 中使用 IN_MULTICAST() 宏 defined。例如,
bool a = IN_MULTICAST(ntohl(inet_addr("239.4.4.4")));
【讨论】:
/**********************************************************************************************************************
* 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] & 0xF0) == 0xE0;替换条件。由于 ipaddr_t 是 uint32_t 整个主体可能只是 return (ip & 0xF0000000) == 0xE0000000; - 这也适用于宏。
(ip & 0xF0000000) 不会在 little-endian 系统上测试错误的字节吗?