Существует ли функция, которая проверяет, указывает ли sockaddr * с именем sptr на адрес ipv4 или ipv6? - PullRequest
0 голосов
/ 05 февраля 2019

Существует ли функция, которая проверяет, указывает ли sockaddr * с именем sptr на адрес ipv4 или ipv6?Например, у меня есть код ниже, как я могу добавить на него, чтобы узнать, является ли адрес ipv4 или ipv6, я могу использовать getaddrinfo()?

struct sockaddr *sptr;
struct sockaddr_in *ipv4_ptr;

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019

Структуры для семейств адресов 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 для сетевых адресов за один раз.

0 голосов
/ 05 февраля 2019

Вы можете проверить элемент sa_family:

switch (sptr->sa_family)
{
    case AF_INET:
    /* IPv4 */
    break;

    case AF_INET6:
    /* IPv6 */
    break;

    default:
    /* Something else */
}

Если элемент sa_family равен AF_INET, это указывает на адрес IPv4, а адрес сокета на самом деле struct sockaddr_in *.Если элемент sa_family равен AF_INET6, это означает, что адрес IPv6 и адрес сокета на самом деле struct sockaddr_in6.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...