getaddrinfo returns EAI_ADDRFAMILY 在使用 Yocto 构建的发行版上
getaddrinfo returns EAI_ADDRFAMILY on a distribution built with Yocto
我们目前正在使用 Oat++ (https://oatpp.io/) 作为嵌入式项目的网络服务器。
它在几个环境中运行良好:docker 容器,ubuntu 虚拟机,Raspberry Pi 3.
但是,对于这个项目,我们自己的 linux 使用 Yocto (https://www.yoctoproject.org/) and after some debugging, we realize that the 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)),同样没有成功
嗯,我们发现问题不在 getaddrinfo 上...很抱歉。
问题是因为 IPv6(linux 的 SimpleTCPConnectionProvider 的实现仅使用 INET6),而我们的系统仅使用 IPv4 构建。
所以我创建了自己的 ServerConnectionProvider,它使用 INET 而不是 INET6 实现套接字。
我们目前正在使用 Oat++ (https://oatpp.io/) 作为嵌入式项目的网络服务器。 它在几个环境中运行良好:docker 容器,ubuntu 虚拟机,Raspberry Pi 3.
但是,对于这个项目,我们自己的 linux 使用 Yocto (https://www.yoctoproject.org/) and after some debugging, we realize that the 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)),同样没有成功
嗯,我们发现问题不在 getaddrinfo 上...很抱歉。
问题是因为 IPv6(linux 的 SimpleTCPConnectionProvider 的实现仅使用 INET6),而我们的系统仅使用 IPv4 构建。
所以我创建了自己的 ServerConnectionProvider,它使用 INET 而不是 INET6 实现套接字。