将struct in_addr转换为文本

Mat*_*att 3 c sockets

只是想知道我是否有一个结构in_addr,如何将其转换回主机名?

caf*_*caf 6

您可以使用getnameinfo()通过包装你struct in_addrstruct sockaddr_in:

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);
}
Run Code Online (Sandbox Code Playgroud)


R..*_*R.. 5

现代代码不应该struct in_addr直接使用,而应该使用sockaddr_in. 更好的是永远不要直接创建或访问任何类型的sockaddr结构,并通过getaddrinfogetnameinfo库调用完成所有操作。例如,要查找主机名或文本格式的 IP 地址:

struct addrinfo *ai;
if (getaddrinfo("8.8.8.8", 0, 0, &ai)) < 0) goto error;
Run Code Online (Sandbox Code Playgroud)

并获取地址的名称(或文本格式的 ip 地址,如果它不反向解析):

if (getnameinfo(ai.ai_addr, ai.ai_addrlen, buf, sizeof buf, 0, 0, 0) < 0) goto error;
Run Code Online (Sandbox Code Playgroud)

我能想到的唯一一次您可能需要任何sockaddr类型结构的时间是在使用getpeernamegetsockname在套接字上时,或recvfrom. sockaddr_storage除非您事先知道地址族,否则您应该使用这里。

我给出这个建议有 3 个原因:

  1. 使用这两个函数完成所有字符串到地址和返回的转换比单独编写所有情况(处理查找失败并尝试将地址解析为 ip 等)要容易得多。
  2. 以这种方式编码使得支持 IPv6(以及可能的其他非 IPv4)协议变得微不足道。
  3. 旧的功能gethostbynamegethostbyaddr实际上是从POSIX的最新版本中删除,因为他们被认为已经过时这么/已过时/破碎。