gethostbyname是否保证返回具有IPv4地址的hostent结构?

时间:2010-05-06 18:45:30

标签: c ipv4 gethostbyname hostent

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

gethostbyname(...)函数是否保证在成功时返回仅包含IPv4(AF_INET)地址的hostent结构,以便以下代码始终指向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;
}

2 个答案:

答案 0 :(得分:2)

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

如果你的应用只是IPV4,那么如果用户没有合适的接口连接到远程主机,就不难发现你正在处理IPV6并且输出错误。即使您的应用支持两者,用户的网关支持什么?

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

修改

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

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

答案 1 :(得分: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是“每个”地址的长度。