2017-05-30 2 views
-1

Ich versuche, eine Funktion zu schreiben, um zu überprüfen, ob meine ip innerhalb Subnetz-Maske ist, wie folgt: -inet_addr(), um die lange für IP in umgekehrter Reihenfolge der Rückkehr

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

Problem ist seine nicht funktioniert. Beim Debugging habe ich gesehen, dass die Funktion inet_addr() das Long für IP in umgekehrter Reihenfolge zurückgibt. Zum Beispiel, wenn ich das tue, isIPinSubnet("192.168.0.15","192.168.0.1",24);

die langen inet_addr Renditen für IP: 192.168.0.15 ist 251701440 und IP: 192.168.0.116820416 ist.

hier http://www.smartconversion.com/unit_conversion/IP_Address_Converter.aspx

251701440 entspricht IP: 15.0.168.192 prüfen und

16820416 entspricht IP: 1.0.168.192 , die eindeutig das Gegenteil von dem, was wir inet_addr weitergegeben.

Warum verhält sich das so? Wie man es repariert?

+1

Netzwerk-Byte-Reihenfolge-versus-Host-Byte-Reihenfolge ... Von [die MSDN 'inet_addr' Referenz] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms738563 (v = vs.85) .aspx): "Alle Internetadressen werden in der IP-Netzwerkreihenfolge zurückgegeben" –

+2

Siehe htonl oder sein Freund ntohl. –

Antwort

0

Aus den Kommentaren von @Someprogrammerdude, bei Frage, ist das Problem aufgrund der Nichtübereinstimmung von Netzwerk-Byte-Reihenfolge und Host-Byte-Reihenfolge. Um das Problem in meinem Code zu beheben, können wir htonl verwenden und es funktioniert gut.

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