1

我不能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;
}
4

2 回答 2

2

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

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

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

编辑

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

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

于 2010-05-06T18:50:47.033 回答
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 是“每个”地址的长度。

于 2011-11-28T21:04:37.947 回答