Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ inet_addr()按相反顺序返回long for IP_C++_Windows_Ip_Winsock_Wininet - Fatal编程技术网

C++ inet_addr()按相反顺序返回long for IP

C++ inet_addr()按相反顺序返回long for IP,c++,windows,ip,winsock,wininet,C++,Windows,Ip,Winsock,Wininet,我正在尝试编写一个函数来检查我的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); netwo

我正在尝试编写一个函数来检查我的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;
}
bool-isIPinSubnet(CString-ip、CString-network、int-keepbits)
{ 
ULONG ip_addr=0;
ULONG网络地址=0;
UINT32掩码地址=~(~(UINT32)(0)>>保留位);
ip地址=inet地址(ip);
网络地址=inet地址(网络);
ULONG net\u lower=(网络地址和掩码地址);
ULONG net_up=(net_lower |(~mask_addr));

如果@Someprogrammerdude的评论中的(ip_addr>=net_lower&&ip_addr,那么问题是由于网络字节顺序与主机字节顺序不匹配。要解决代码中的问题,我们可以使用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;
}
bool-isIPinSubnet(CString-ip、CString-network、int-keepbits)
{ 
ULONG ip_addr=0;
ULONG网络地址=0;
UINT32掩码地址=~(~(UINT32)(0)>>保留位);
ip_addr=htonl(inet_addr(ip));//感谢@ChrisBecke
网络地址=htonl(网络地址);
ULONG net\u lower=(网络地址和掩码地址);
ULONG net_up=(net_lower |(~mask_addr));

如果(ip地址>=net\u lower&&ip地址网络字节顺序与主机字节顺序…来自:“所有Internet地址都以ip的网络顺序返回”,请参阅htonl或其朋友NTHOL。