【问题标题】:getaddrinfo returns EAI_ADDRFAMILY on a distribution built with Yoctogetaddrinfo 在使用 Yocto 构建的发行版上返回 EAI_ADDRFAMILY
【发布时间】:2020-01-08 12:33:15
【问题描述】:

我们目前正在使用 Oat++ (https://oatpp.io/) 作为嵌入式项目的网络服务器。 它在以下几个环境中运行良好:docker 容器、ubuntu VM、Raspberry Pi 3。

但是,对于这个项目,我们使用 Yocto (https://www.yoctoproject.org/) 构建了自己的 linux 发行版,经过一些调试,我们意识到 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)),同样没有成功

【问题讨论】:

  • 你使用的是 glibc 还是 musl?
  • 您好@ThmX,据我了解,您在谈论 oatpp 客户端连接提供程序。在早期,它使用gethostbyname 方法而不是getaddrinfo,如果您可以选择 - 尝试使用它。我不知道它是否适用于 Yocto,但根据互联网上的信息碎片它应该。请参阅客户端连接提供程序的上一版本 - github.com/oatpp/oatpp/blob/…
  • 除了仔细检查实际的网络配置(例如,它真的是 IPv4 吗?)我唯一能想到的就是“提示”结构初始化:您应该将其初始化为零。

标签: linux embedded embedded-linux yocto getaddrinfo


【解决方案1】:

好吧,我们发现问题不在于 getaddrinfo...抱歉。

问题是因为 IPv6(Linux 上 SimpleTCPConnectionProvider 的实现仅使用 INET6),而我们的系统仅使用 IPv4 构建。

所以我创建了自己的 ServerConnectionProvider,它使用 INET 而不是 INET6 实现了一个套接字。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-17
    • 2020-07-28
    • 1970-01-01
    • 2021-10-05
    • 1970-01-01
    • 1970-01-01
    • 2023-02-07
    • 2015-07-22
    相关资源
    最近更新 更多