inet_addr() 以相反的顺序返回 IP 的 long
inet_addr() returning the long for IP in reverse order
我正在尝试编写一个函数来检查我的 ip 是否在子网掩码内,如下所示:-
bool isIPinSubnet(CString ip, CString network, int keepbits)
{
ULONG ip_addr = 0;
ULONG network_addr = 0;
UINT32 mask_addr = ~(~(UINT32)(0) >> keepbits);
ip_addr = inet_addr(ip);
network_addr = inet_addr(network);
ULONG net_lower = (network_addr & mask_addr);
ULONG net_upper = (net_lower | (~mask_addr));
if ( ip_addr >= net_lower && ip_addr <= net_upper ) {
return true;
}
return false;
}
问题是它不工作。在调试时,我看到 inet_addr() 函数以相反的顺序返回 IP 的 long。
例如,如果我这样做,isIPinSubnet("192.168.0.15","192.168.0.1",24);
IP: 192.168.0.15
的长 inet_addr returns 是 251701440
IP: 192.168.0.1
是 16820416
.
在此处查看http://www.smartconversion.com/unit_conversion/IP_Address_Converter.aspx
251701440
对应IP: 15.0.168.192
,而
16820416
对应IP: 1.0.168.192
这显然与我们传递给 inet_addr.
的相反
为什么会这样?如何解决?
根据@Someprogrammerdude 的评论,问题是网络字节顺序与主机字节顺序不匹配。要解决我的代码中的问题,我们可以使用 htonl,它运行良好。
bool isIPinSubnet(CString ip, CString network, int keepbits)
{
ULONG ip_addr = 0;
ULONG network_addr = 0;
UINT32 mask_addr = ~(~(UINT32)(0) >> keepbits);
ip_addr = htonl (inet_addr(ip)); //Thanks to @ChrisBecke
network_addr = htonl (inet_addr(network));
ULONG net_lower = (network_addr & mask_addr);
ULONG net_upper = (net_lower | (~mask_addr));
if ( ip_addr >= net_lower && ip_addr <= net_upper ) {
return true;
}
return false;
}
我正在尝试编写一个函数来检查我的 ip 是否在子网掩码内,如下所示:-
bool isIPinSubnet(CString ip, CString network, int keepbits)
{
ULONG ip_addr = 0;
ULONG network_addr = 0;
UINT32 mask_addr = ~(~(UINT32)(0) >> keepbits);
ip_addr = inet_addr(ip);
network_addr = inet_addr(network);
ULONG net_lower = (network_addr & mask_addr);
ULONG net_upper = (net_lower | (~mask_addr));
if ( ip_addr >= net_lower && ip_addr <= net_upper ) {
return true;
}
return false;
}
问题是它不工作。在调试时,我看到 inet_addr() 函数以相反的顺序返回 IP 的 long。
例如,如果我这样做,isIPinSubnet("192.168.0.15","192.168.0.1",24);
IP: 192.168.0.15
的长 inet_addr returns 是 251701440
IP: 192.168.0.1
是 16820416
.
在此处查看http://www.smartconversion.com/unit_conversion/IP_Address_Converter.aspx
251701440
对应IP: 15.0.168.192
,而
16820416
对应IP: 1.0.168.192
这显然与我们传递给 inet_addr.
为什么会这样?如何解决?
根据@Someprogrammerdude 的评论,问题是网络字节顺序与主机字节顺序不匹配。要解决我的代码中的问题,我们可以使用 htonl,它运行良好。
bool isIPinSubnet(CString ip, CString network, int keepbits)
{
ULONG ip_addr = 0;
ULONG network_addr = 0;
UINT32 mask_addr = ~(~(UINT32)(0) >> keepbits);
ip_addr = htonl (inet_addr(ip)); //Thanks to @ChrisBecke
network_addr = htonl (inet_addr(network));
ULONG net_lower = (network_addr & mask_addr);
ULONG net_upper = (net_lower | (~mask_addr));
if ( ip_addr >= net_lower && ip_addr <= net_upper ) {
return true;
}
return false;
}