Linux 调用getaddrinfo时,在ai_canonname字段中可以预期什么 #包括 #包括 #包括 #包括 #包括 #包括 内部主(空) { int ret; 结构addrinfo提示; 结构addrinfo*res; 结构addrinfo*p; bzero(&提示,sizeof(提示)); hints.ai_family=AF_unsec;//IPV4或IPV6 hints.ai_socktype=SOCK_STREAM;//TCP hits.ai_flags=ai_CANONNAME; if((ret=getaddrinfo(“216.58.221.36”,NULL,&提示,&res))!=0{//here 出口(-1); } p=res; printf(“%s\n”,p->ai\u canonname); 返回0; }

Linux 调用getaddrinfo时,在ai_canonname字段中可以预期什么 #包括 #包括 #包括 #包括 #包括 #包括 内部主(空) { int ret; 结构addrinfo提示; 结构addrinfo*res; 结构addrinfo*p; bzero(&提示,sizeof(提示)); hints.ai_family=AF_unsec;//IPV4或IPV6 hints.ai_socktype=SOCK_STREAM;//TCP hits.ai_flags=ai_CANONNAME; if((ret=getaddrinfo(“216.58.221.36”,NULL,&提示,&res))!=0{//here 出口(-1); } p=res; printf(“%s\n”,p->ai\u canonname); 返回0; },linux,sockets,getaddrinfo,Linux,Sockets,Getaddrinfo,如果getaddrinfo的第一个参数如上所述为216.58.221.36,则输出为:216.58.221.36 如果getaddrinfo的第一个参数是www.google.com,则输出是www.google.com 为什么??在这两种情况下,ai\u canonname的值不应该相同吗?为什么会这样?它返回您给getaddrinfo()的任何输入的规范形式,无论是IP字符串还是主机名。你看过报纸了吗?“如果hints.ai_标志包含ai_CANONNAME标志,则返回列表中第一个addri

如果
getaddrinfo
的第一个参数如上所述为
216.58.221.36
,则输出为:
216.58.221.36

如果
getaddrinfo
的第一个参数是
www.google.com
,则输出是
www.google.com


为什么??在这两种情况下,
ai\u canonname
的值不应该相同吗?

为什么会这样?它返回您给
getaddrinfo()
的任何输入的规范形式,无论是IP字符串还是主机名。你看过报纸了吗?“如果hints.ai_标志包含ai_CANONNAME标志,则返回列表中第一个addrinfo结构的ai_CANONNAME字段设置为指向主机的正式名称。”是的,我读过。我认为正式名称可能是唯一的。也许它是一个完全限定的域名,比如“www…”。因此,当输出为IP地址时,我感到困惑。FQDN和规范名称是一样的吗?谢谢!如果您将IP地址传递给
getaddrinfo()
,它不会执行查找以试图找到主机名,正如您所看到的。它应该只返回IP的规范格式。尝试向它传递一个短的IPv6地址,它应该会扩展。请参阅传入真实主机名将返回不同的规范主机名的示例。非常清楚,谢谢您的时间!
#include <stdio.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdlib.h>

int main(void)
{
    int ret;
    struct addrinfo hints;
    struct addrinfo *res;
    struct addrinfo *p;

    bzero(&hints, sizeof(hints));
    hints.ai_family = AF_UNSPEC;            // IPV4 or IPV6
    hints.ai_socktype = SOCK_STREAM;        // TCP
    hints.ai_flags = AI_CANONNAME;

    if ((ret=getaddrinfo("216.58.221.36", NULL, &hints, &res)) != 0) {     // here 
        exit(-1);
    }
    p = res; 
    printf("%s\n", p->ai_canonname);
    return 0;
}