getaddrinfo возвращает EAI_ADDRFAMILY для дистрибутива, созданного с помощью Yocto.

В настоящее время мы используем Oat++ (https://oatpp.io/) в качестве веб-сервера для встроенного проекта. Он прекрасно работает с несколькими средами: Docker-контейнер, Ubuntu VM, Raspberry Pi 3.

Однако для этого проекта у нас есть собственный дистрибутив Linux, созданный с помощью Yocto (https://www.yoctoproject.org/) и после некоторой отладки мы понимаем, что getaddrinfo (http://man7.org/linux/man-pages/man3/getaddrinfo.3.html) не работает.

Вот пример кода того, что происходит:

struct addrinfo *result = NULL;
struct addrinfo hints;
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP;
hints.ai_flags = AI_PASSIVE;

int iResult = getaddrinfo(NULL, "8080", &hints, &result);

// iResult == EAI_ADDRFAMILY

Кто-нибудь знает, в чем может быть проблема?

PS: Мы пытались сравнить конфигурацию ядра с конфигурацией Raspberry Pi 3, но безуспешно. PSS: Мы также пытались установить IP (т.е.: getaddrinfo("192.168.1.10", "8080", &hints, &result)), также безуспешно


person ThmX    schedule 08.01.2020    source источник
comment
вы используете glibc или musl?   -  person vermaete    schedule 08.01.2020
comment
Здравствуйте @ThmX, насколько я понимаю, вы говорите о поставщике клиентских подключений oatpp. В первые дни он использовал метод gethostbyname вместо getaddrinfo, если это вариант для вас - попробуйте его использовать. Я не знаю, работает ли это на Yocto, но, судя по обрывкам информации в Интернете, должно. См. предыдущую версию поставщика клиентских подключений — github.com/oatpp/oatpp/blob/   -  person lganzzzo    schedule 08.01.2020
comment
Помимо двойной проверки фактической конфигурации сети (например, действительно ли это IPv4?), единственное, о чем я могу думать, это инициализация структуры «подсказок»: вы должны инициализировать ее нулями.   -  person Jussi Kukkonen    schedule 09.01.2020


Ответы (1)


Итак, мы обнаружили, что проблема была не в getaddrinfo... Извините за это.

Проблема была из-за IPv6 (реализация SimpleTCPConnectionProvider для Linux использует только INET6), а наша система построена только с IPv4.

Поэтому я создал свой собственный ServerConnectionProvider, который реализует сокет с INET вместо INET6.

person ThmX    schedule 15.01.2020