代码之家  ›  专栏  ›  技术社区  ›  hookenz

将地址中的结构转换为文本

  •  3
  • hookenz  · 技术社区  · 14 年前

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

    2 回复  |  直到 14 年前
        1
  •  6
  •   caf    14 年前

    你可以使用 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);
    }
    
        2
  •  4
  •   R.. GitHub STOP HELPING ICE    14 年前

    现代代码不应该使用 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;
    

    我唯一能想到的其他时间你什么时候需要 索卡德尔 类型结构在使用时 getpeername getsockname 在套接字上,或 recvfrom . 这里你应该用 sockaddr_storage 除非你事先知道地址家庭。

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

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