Inet_addr()以相反的顺序返回IP的长期
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的漫长。例如,如果我这样做,isIPinSubnet("192.168.0.15","192.168.0.1",24);
IP: 192.168.0.15
的长INET_ADDR返回是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;
}
相关文章:
- 函数应该按 (row,col) 或 (col,row) 顺序接受/返回值吗?
- Inet_addr()以相反的顺序返回IP的长期
- YAML-CPP的顺序返回数据
- 递归C++字母顺序函数重复返回相同的值
- 格式化顺序IF语句具有相似返回(C )
- 将fetch_add与宽松的内存顺序返回唯一值
- 返回对象时CTOR/DTOR的顺序
- 带有返回键的 Qt 选项卡顺序
- 如何按值对**boost::unorderede_map**进行排序,并按该顺序仅返回键
- placeNumbers应该返回数字的顺序,以便满足布尔值向量中编码的条件
- C++对返回*this的成员函数的重复调用顺序
- 编写一个函数,返回一个堆栈,该堆栈包含所有小于给定数字的元素,并且顺序相同
- 我的C++DLL返回两个顺序调用混合的数据
- 如何在 std::vector 中查找重复项<strings>并返回一个 std::list 它们按字母顺序排序,在该结果列表中没有重复项
- C++:为什么返回false的集合顺序的函子只允许向集合中添加一个元素
- 递归:按顺序遍历返回列表
- 返回类型取决于算术运算的顺序.对吗?
- 返回不正确值的数组的顺序求和
- 函数返回值的顺序
- 如何以相反的顺序返回字符串