Структуры для семейств адресов AF_INET
и AF_INET6
различны, поэтому вы должны использовать для них разные типы указателей.Чтобы продолжить, используйте:
struct sockaddr *genptr;
... /* initialize genptr to point to the sockaddr structure */
switch (genptr->sa_family) {
case AF_INET: {
struct sockaddr_in *ipv4ptr = (struct sockaddr_in *)genptr;
/* check IPV4 addresses using ipv4ptr pointer */
} break;
case AF_INET6: {
struct sockaddr_in6 *ipv6ptr = (struct sockaddr_in6 *)genptr;
/* check IPV6 addresses using ipv6ptr pointer */
} break;
default: /* NEITHER IPV4 NOR IPV6, IPX? NETBIOS? X25? */
} /* switch */
, хотя и менее эффективный, вы можете конвертировать свои адреса с помощью подпрограммы , не зависящей от версии *1007* inet_ntop(3)
, и использовать некоторый алгоритм сопоставления регулярных выраженийчастично сопоставить адреса.inet_ntop
Процедуры получают общий указатель и строят строку ascii ipv4 / ipv6 для сетевых адресов за один раз.