求主网络,子网掩码
下面为自己写的代码,直接根据有类网络IP地址的定义进行解析。
/*!
*\fn UINT32 ucRipGetNetIP()
*\brief get network ip address by a ip address
*\details
*\param[in] UINT32 ipAddr the ip address
*\return UINT32
*\retval the network ip address
*\author NieYong <NieYong@tp-link.net>
*/
UINT32 ucRipGetNetIP(UINT32 ipAddr)
{
UINT32 net_ipAddr = 0;
char *byte;
char *net_byte;
byte = (char*)&ipAddr;
net_byte = (char*)&net_ipAddr;
/* get the network ip address */
if(0x00 == (0x80 & (*byte))) /* 1~127 */
{
*(net_byte) = *(byte);
}
else if(0x00 == (0x40 & (*byte))) /* 128~191 */
{
*(net_byte) = *(byte);
*(net_byte + 1) = *(byte + 1);
}
else if(0x00 == (0x20 & (*byte))) /* 192~223 */
{
*(net_byte) = *(byte);
*(net_byte + 1) = *(byte + 1);
*(net_byte + 2) = *(byte + 2);
}
else
{
*(net_byte) = *(byte);
*(net_byte + 1) = *(byte + 1);
*(net_byte + 2) = *(byte + 2);
*(net_byte + 3) = *(byte + 3);
}
return net_ipAddr;
}
下面是使用in.h中的宏重写的版本。
/*!
*\fn UINT32 swRipNetAddr()
*\brief get network address part of ip address
*\details
*\param[in] UINT32 ipAddr the ip address
*\return UINT32
*\retval the network address part
*\author NieYong <NieYong@tp-link.net>
*/
UINT32 swRipNetAddr(UINT32 ipAddr)
{
/* get the network address part */
if(IN_CLASSA(ipAddr)) /* 1~127 */
{
return (ipAddr & IN_CLASSA_NET);
}
else if(IN_CLASSB(ipAddr)) /* 128~191 */
{
return (ipAddr & IN_CLASSB_NET);
}
else if(IN_CLASSC(ipAddr)) /* 192~223 */
{
return (ipAddr & IN_CLASSC_NET);
}
else
{
return (ipAddr);
}
}
在in.h文件中,宏的定义如下:
/* * Definitions of bits in internet address integers. * On subnets, the decomposition of addresses to host and net parts * is done according to subnet mask, not the masks here. */ #define IN_CLASSA(i) (((u_int32_t)(i) & 0x80000000) == 0) #define IN_CLASSA_NET 0xff000000 #define IN_CLASSA_NSHIFT 24 #define IN_CLASSA_HOST 0x00ffffff #define IN_CLASSA_MAX 128 #define IN_CLASSB(i) (((u_int32_t)(i) & 0xc0000000) == 0x80000000) #define IN_CLASSB_NET 0xffff0000 #define IN_CLASSB_NSHIFT 16 #define IN_CLASSB_HOST 0x0000ffff #define IN_CLASSB_MAX 65536 #define IN_CLASSC(i) (((u_int32_t)(i) & 0xe0000000) == 0xc0000000) #define IN_CLASSC_NET 0xffffff00 #define IN_CLASSC_NSHIFT 8 #define IN_CLASSC_HOST 0x000000ff #define IN_CLASSD(i) (((u_int32_t)(i) & 0xf0000000) == 0xe0000000) #define IN_CLASSD_NET 0xf0000000 /* These ones aren't really */ #define IN_CLASSD_NSHIFT 28 /* net and host fields, but */ #define IN_CLASSD_HOST 0x0fffffff /* routing needn't know. */ #define IN_MULTICAST(i) IN_CLASSD(i)