Существует ли библиотечная функция для определения того, является ли IP-адрес (IPv4 и IPv6) частным / локальным в C / C ++?

1, учитывая 32-разрядное целочисленное значение, как точно определить, является ли это частный адрес IPv4.

2, учитывая 128-битное целочисленное значение, как точно определить, является ли это частным IPv6-адресом.

Рассмотрим порядок байтов IP-адреса на разных платформах, поэтому каждый раз при написании такой обычной маленькой функции склонна к ошибкам. Так что я думаю, что для этого должна быть библиотечная функция?

1

Решение

Это поможет вам начать. Я не потрудился включить диапазон адресов «link local», но это упражнение, которое вы можете выполнить, изменив код ниже.

IPV6 немного отличается. И ваш вопрос немного искажен, так как большинство систем не имеют собственного 128-битного типа. Адреса IPv6 обычно содержатся в виде массива из 16 байтов, встроенного в структуру sockaddr_in6.

Все, что вам нужно знать, чтобы закончить этот пример, находится на эта ссылка здесь.

// assumes ip is in HOST order.  Use ntohl() to convert as approrpriate

bool IsPrivateAddress(uint32_t ip)
{
uint8_t b1, b2, b3, b4;
b1 = (uint8_t)(ip >> 24);
b2 = (uint8_t)((ip >> 16) & 0x0ff);
b3 = (uint8_t)((ip >> 8) & 0x0ff);
b4 = (uint8_t)(ip & 0x0ff);

// 10.x.y.z
if (b1 == 10)
return true;

// 172.16.0.0 - 172.31.255.255
if ((b1 == 172) && (b2 >= 16) && (b2 <= 31))
return true;

// 192.168.0.0 - 192.168.255.255
if ((b1 == 192) && (b2 == 168))
return true;

return false;
}
2

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

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

По вопросам рекламы [email protected]