Есть ли умный / хитрый способ проанализировать, является ли представленный в строке IP-адрес действительным, и распознать его версию, чтобы можно было преобразовать его в соответствующую структуру, просто используя API UNIX?
Я не хочу использовать регулярные выражения, нет необходимости добавлять зависимости к дополнительным библиотекам.
Мой первый подход был следующим:
in_addr addr;
memset( &addr, 0, sizeof( in_addr ) );
// try to convert from standard numbers-and-dots notation into binary data
if( 0 != inet_aton( sIPAddress.c_str(), &addr ) )
{
return Socket::enIPv4; // valid IPv4
}
in6_addr addr6;
memset( &addr6, 0, sizeof( in6_addr ) );
if( inet_pton( AF_INET6, sIPAddress.c_str(), &addr6 ) > 0 )
{
return Socket::enIPv6; // valid IPv6
}
return Socket::enUnknown;
Проблема здесьчто если я передам строку типа 1
, она успешно преобразуется в IPv4.Строка типа 11111
также конвертируется в IPv4.По документации:
inet_aton () возвращает ненулевое значение, если адрес действителен, ноль - если нет.
Очевидно, что эта функция распознает не только формат XXX.XXX.XXX.XXX
,но делает что-то более внутреннее.
Конечно, я могу написать свою собственную функцию (и на самом деле это будет весело), анализируя строку, но вместо этого я хотел использовать уже существующие и протестированные функции.Это возможно, или я должен написать свой собственный?