inet_addr()以相反的顺序返回IP的长度

时间:2017-05-30 08:21:20

标签: c++ windows ip winsock wininet

我正在尝试编写一个函数来检查我的ip是否在子网掩码内,如下所示: -

SELECT * FROM Matches WHERE Goal not in(
select COLUMN_DEFAULT from information_schema.COLUMNS where TABLE_NAME='Matches' 
 and COLUMN_NAME='Goal');

问题是它不起作用。在调试时,我看到inet_addr()函数以相反的顺序返回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; }

isIPinSubnet("192.168.0.15","192.168.0.1",24);的long inet_addr返回值为IP: 192.168.0.15 251701440IP: 192.168.0.1

点击此处http://www.smartconversion.com/unit_conversion/IP_Address_Converter.aspx

16820416对应251701440

IP: 15.0.168.192对应16820416 这显然与我们传递给inet_addr的内容相反。

为什么这样做?如何解决?

1 个答案:

答案 0 :(得分:0)

来自@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;
}