Inet_addr()以相反的顺序返回IP的长期

inet_addr() returning the long for IP in reverse order

本文关键字:顺序 返回 IP addr Inet      更新时间:2023-10-16

我正在尝试编写一个函数以检查我的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的漫长。例如,如果我这样做,isIPinSubnet("192.168.0.15","192.168.0.1",24);

IP: 192.168.0.15的长INET_ADDR返回是251701440IP: 192.168.0.116820416

在此处检查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;
}