我想知道如果我有一个结构体 in_addr,如何将其转换回主机名?
struct in_addr
包装在struct sockaddr_in
中来使用getnameinfo()
:int get_host(struct in_addr addr, char *host, size_t hostlen)
{
struct sockaddr_in sa = { .sin_family = AF_INET, .sin_addr = my_in_addr };
return getnameinfo(&sa, sizeof sa, host, hostlen, 0, 0, 0);
}
现代代码不应直接使用struct in_addr
,而应该使用sockaddr_in
。更好的方法是根本不直接创建或访问任何类型的sockaddr
结构,并通过getaddrinfo
和getnameinfo
库调用完成所有操作。例如,要查找主机名或文本形式的IP地址:
struct addrinfo *ai;
if (getaddrinfo("8.8.8.8", 0, 0, &ai)) < 0) goto error;
获取地址的名称(或文本形式的IP地址,如果它没有反向解析):
if (getnameinfo(ai.ai_addr, ai.ai_addrlen, buf, sizeof buf, 0, 0, 0) < 0) goto error;
sockaddr
类型结构的场景,那就是在套接字上使用 getpeername
或 getsockname
,或者使用 recvfrom
。在这种情况下,除非您事先知道地址族,否则应该使用 sockaddr_storage
。gethostbyname
和 gethostbyaddr
实际上已从最新版本的 POSIX 中删除,因为它们被认为过时/废弃/已损坏。freeaddrinfo
来释放它。 - dreamlaxai
的*
。现在已经修复了。 - R.. GitHub STOP HELPING ICEfreeaddrinfo
是不必要且有潜在危害的。释放资源仅在将在其生命周期内执行任意大量查找的程序中才有益。当然,仅对结果进行短暂使用并返回给调用者的库需要立即释放其资源。 - R.. GitHub STOP HELPING ICE