inet_addr () возвращает long для IP в обратном порядке

Я пытаюсь написать функцию, чтобы проверить, находится ли мой 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 () возвращает long для IP в обратном порядке.
Например, если я делаю это, isIPinSubnet("192.168.0.15","192.168.0.1",24);

длинный inet_addr возвращается для IP: 192.168.0.15 является 251701440
а также IP: 192.168.0.1 является 16820416,

Проверка здесь 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

Решение

Судя по комментариям @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;
}
0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru