getaddrinfo возвращает ошибку -2 при получении ipv6 (getaddrinfo: имя или служба неизвестны) - PullRequest
0 голосов
/ 04 января 2019

Я пытаюсь написать клиент-серверную программу для ipv6.Я сталкиваюсь с проблемой, когда пытаюсь вызвать функцию getaddrinfo.Возвращает -2 (getaddrinfo: Имя или служба неизвестна).

Это нормально работает в системе Windows, но не работает в Linux.

$ ifconfig |grep inet6
inet6 fe80::e41b:2c23:a286:77a  prefixlen 64  scopeid 0x20<link>
inet6 ::1  prefixlen 128  scopeid 0x10<host>

ifconfig говорит, что ipv6 включен.Даже я могу пропинговать этот ip с другого хоста.

#include <iostream>
#include <string.h>
#include <netdb.h>
#include <arpa/inet.h>

int main(int argc, char** argv)
{
    addrinfo hints = {}, *results, *res;
    memset(&hints, 0, sizeof(hints));
    hints.ai_family = AF_INET6;
    hints.ai_socktype = SOCK_STREAM;
    hints.ai_protocol = IPPROTO_TCP;

    int m = getaddrinfo(argv[1], "2019", &hints, &results);
    if (m < 0)
    {
        std::cout << "getaddrinfo : " << gai_strerror(m) << std::endl;
        return 1;
    }

    for(res = results; res != NULL; res = res->ai_next)
    {
        char straddr[INET6_ADDRSTRLEN] = {};
        if (inet_ntop(res->ai_family, &(reinterpret_cast<sockaddr_in6*>(res->ai_addr)->sin6_addr), straddr, sizeof(straddr)))
            std::cout << "IP - " << straddr << "\n";
        else
            std::cout << "inet_ntop error";
    }

    freeaddrinfo(results);

    return 0;
}

Предполагается, что он будет печатать ip в формате v6, но он печатает getaddrinfo: Имя или служба неизвестна

...