将struct in_addr转换为文本

时间:2010-11-26 03:14:13

标签: c sockets

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

2 个答案:

答案 0 :(得分:6)

您可以getnameinfo()struct in_addr包裹在struct 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); }

{{1}}

答案 1 :(得分:4)

现代代码不应直接使用struct in_addr,而应使用sockaddr_in。更好的方法是永远不要直接创建或访问任何类型的sockaddr结构,并通过getaddrinfogetnameinfo库调用执行所有操作。例如,要查找主机名或文本格式的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类型结构时,我能想到的另一个时间是在套接字上使用getpeernamegetsockname,或recvfrom。除非您事先了解地址系列,否则应使用sockaddr_storage

我提出这个建议有三个原因:

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