我不能使用 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;
}
有帮助吗?

解决方案

不, gethostbyname() 可以返回ipv4(标准点)或ipv6(标准结肠,也许是点)表示法, 至少在Linux上. 。您需要处理。我认为它的各种实现仅返回IPv4(例如 php),但是我使用的每个C平台都可以并且将两者都返回。

如果您的应用仅是IPv4,那么如果用户没有合适的接口可以连接到远程主机,则不难弄清楚您正在处理IPv6并出错。即使您的应用程序都支持两者, 用户的 网关支持?

超过三个 . 或存在 : ..它的IPv6。

编辑

h_addrh_addrlist_[0], , 尽管 h_length 是所有地址的长度。

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

其他提示

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是“每个”地址的长度。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top