2017-05-30 261 views
-1

我試圖寫一個函數來檢查我的IP是子網掩碼內,如下圖所示: -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; 
} 

問題是其不能正常工作。在調試時,我看到inet_addr()函數以相反的順序返回IP的長度。 例如,如果我這樣做,isIPinSubnet("192.168.0.15","192.168.0.1",24);

長inet_addr回報IP: 192.168.0.15251701440IP: 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相反。

爲什麼這樣表現?如何解決它?

+1

網絡字節順序抗宿主字節順序...從[MSDN的'inet_addr'參考](https://msdn.microsoft.com/en-us/library/windows/desktop/ms738563(V = vs.85).aspx):「所有Internet地址都以IP的網絡順序返回」 –

+2

請參閱htonl或其朋友ntohl。 –

回答

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; 
}