Сравнение IPv6-адреса партнера с localhost - PullRequest
4 голосов
/ 19 мая 2010

Я позвонил getpeername на своем подключенном сокете и теперь у меня есть IPv6-адрес подключенного партнера. Как мне узнать, является ли IP-адрес моего коллеги localhost?

Редактировать: Чтобы уточнить, я имею в виду localhost , как в IP-адресе обратной связи.

Ответы [ 3 ]

3 голосов
/ 19 мая 2010

После исключения адреса обратной связи восстановите список текущих активных IP-адресов локального компьютера (ему может быть назначено несколько IP-адресов для разных сетей), а затем выполните цикл по этому списку, пока не найдете совпадение. Как вы на самом деле получите этот список, зависит от операционной системы, которую вы используете. Для этого ОС может иметь свои собственные API-интерфейсы (например, Windows имеет GetAdaptersInfo () и связанные функции), или вы можете попробовать использовать gethostname () с gethostbyname () или getaddrinfo ().

3 голосов
/ 19 мая 2010

Полагаю, это как посмотреть, является ли входящее соединение локальным, если предположить, что у вас есть одноранговый узел в struct sockaddr_in6, полученный из getpeername, вот так:

    struct sockaddr_in6 peer;
    socklen_t len = sizeof(peer);
    getpeername( sock, (struct sockaddr *) &peer, &len); // todo: error check

Оттуда вы можете заполнить свой собственный struct sockaddr_in6 адресом локального хоста ::1 и сравнить память на равенство:

    struct sockaddr_in6 localhost;
    memset(localhost.sin6_addr.s6_addr, 0, 16);
    localhost.sin6_addr.s6_addr[15] = 1;

    if( memcmp(peer.sin6_addr.s6_addr, localhost.sin6_addr.s6_addr, 16) == 0)
        printf("localhost!\n");

Или вы можете создать массив байтов, которые соответствуют адресу localhost:

    static const unsigned char localhost_bytes[] =
        { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 };

    if( memcmp(peer.sin6_addr.s6_addr, localhost_bytes, 16) == 0)
        printf("localhost!\n");

И следите за отображенным локальным узлом IPv4, ::ffff:127.0.0.1. Возможно, вам придется это проверить.

    static const unsigned char mapped_ipv4_localhost[] =
        { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xff, 0xff, 0x7f, 0, 0, 1 };

    if( memcmp(peer.sin6_addr.s6_addr, mapped_ipv4_localhost, 16) == 0)
        printf("mapped IPv4 localhost!\n");
3 голосов
/ 19 мая 2010

В IPv6 адрес обратной связи равен ::1.

На двоичном уровне это 127 0, за которыми следует один 1.

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