【问题标题】:Is gethostbyname guaranteed to return hostent structures with IPv4 addresses?gethostbyname 是否保证返回带有 IPv4 地址的主机结构?
【发布时间】:2011-02-16 12:51:11
【问题描述】:

我不能使用getaddrinfo(...) 来解析主机名,因此必须坚持使用gethostbyname(...)

gethostbyname(...) 函数是否保证在成功时返回仅包含 IPv4 (AF_INET) 地址的主机结构,因此以下代码将始终导致 IPv4 地址:

int resolve(const char *name, struct in_addr *addr) {

    struct hostent *he = gethostbyname(name);

    if (!he)
        return 1;

    memcpy(addr,he->h_addr_list[0],4);

    return 0;
}

【问题讨论】:

    标签: c ipv4 gethostbyname hostent


    【解决方案1】:

    不,gethostbyname() 可以返回 IPV4(标准点)或 IPV6(标准冒号,或者可能是点)表示法,at least on Linux。你需要处理它。我认为它的各种实现只返回 IPV4(例如 PHP),但我使用过的每个 C 平台都可以并且将返回两者。

    如果您的应用仅支持 IPV4,则不难发现您正在处理 IPV6,并且如果用户没有合适的接口来连接到远程主机,则会出错。即使您的应用同时支持两者,用户的网关支持什么?

    超过三个. 或存在: .. 其IPV6。

    编辑

    h_addrh_addrlist_[0] 的同义词,而h_length 是所有地址的长度。

    也许我没有充分理解您的问题?

    【讨论】:

    • 那么如果 gethostbyname 后面的 DNS 解析器返回一个 IPv6 地址,我的应用程序就会失败?
    • @Robert - 这是主观的。应用的用户能否连接到IPV6地址?
    • @Tim:它也可能成功,因为它是一个检查站点更新的程序。但是,如果我也接受 AF_INET6 ,那么我的结构应该有多大!?
    • @Robert,如果h_addrtypeAF_INET6AF_INETh_length 反映其中任何一个。我不确定我是否理解您的问题?
    • @Robert,你确定不想要gethostbyname2() 吗?
    【解决方案2】:

    h_addrtype 告诉您 h_addr_list 是否包含 IPv4 或 IPv6 或其他类型的地址。您可以使用开关更改行: memcpy(addr,he->h_addr_list[0],4);到 memcpy(addr,he->h_addr_list[0],N);其中 N 是地址类型所需的长度。根据 MSDN 文档,h_length 是“每个”地址的长度。

    【讨论】:

      猜你喜欢
      • 2017-11-29
      • 2016-05-08
      • 2011-09-07
      • 1970-01-01
      • 1970-01-01
      • 2020-12-10
      • 1970-01-01
      • 2018-02-10
      • 2011-02-25
      相关资源
      最近更新 更多