2017-05-30 3 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の逆順でlongを返すことがわかりました。 IP: 192.168.0.15ため例えば 、私はこれをやっている場合は、isIPinSubnet("192.168.0.15","192.168.0.1",24);

長いのinet_addr戻っは251701440IP: 192.168.0.116820416です。ここhttp://www.smartconversion.com/unit_conversion/IP_Address_Converter.aspx

251701440をチェック

IP: 15.0.168.192に対応し、

16820416は明らかに我々はのinet_addrに渡されたものの逆であるIP: 1.0.168.192 に対応しています。

これはなぜこのように動作しますか?それを修正するには?

+1

ネットワークバイトオーダー[MSDN 'inet_addr'参照](https://msdn.microsoft.com/en-us/library/windows/desktop/ms738563(V =からホストバイトオーダー...対vs.85).aspx): "すべてのインターネットアドレスが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; 
} 
関連する問題