在网络编程中,经常会遇到判断一个地址是否为组播地址的问题。live555同样需要解决这个问题。貌似很复杂,其实很简单。
这个代码在groupsock下的NetAdress.cpp文件中,代码如下:
Boolean IsMulticastAddress(netAddressBits address) {
// Note: We return False for addresses in the range 224.0.0.0
// through 224.0.0.255, because these are non-routable
// Note: IPv4-specific #####
netAddressBits addressInNetworkOrder = htonl(address);
return addressInNetworkOrder > 0xE00000FF &&
addressInNetworkOrder <= 0xEFFFFFFF;
}
首先这里接收的是netAddressBits类型的地址,netAddressBits是啥?看代码:
typedef u_int32_t netAddressBits;
htonl()函数将主机数转换成无符号长整型的网络字节顺序,或者说是将一个32位数从主机字节顺序转换成网络字节顺序。啥是网络字节顺序?其实就是所谓的大端,一个数的高位字节存放于低地址单元,低位字节存放在高地址单元中。计算机的内存存储数据时有可能是大尾顺序或者小尾顺序,这里应该会判断一下,如果是小端的话就转换成大端模式。
如何判断的呢?我们知道组播的地址范围是224.0.0.0~239.0.0.0,写成16进制就是:
0xE00000FF~0xEFFFFFFF
所以这里就是判断一下接收的IPv4地址是否在这个范围之间。简单吧!