我无法使用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;
}
答案 0 :(得分:2)
不,gethostbyname()
可以返回IPV4(标准点)或IPV6(标准冒号,或者可能是点)符号,at least on Linux。你需要处理这个问题。我认为它的各种实现只返回IPV4(例如PHP),但我使用的每个C平台都可以并且将返回两者。
如果你的应用只是IPV4,那么如果用户没有合适的接口连接到远程主机,就不难发现你正在处理IPV6并且输出错误。即使您的应用支持两者,用户的网关支持什么?
超过三个.
或:
的存在..其IPV6。
修改强>
h_addr
是h_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是“每个”地址的长度。