【问题标题】:getaddrinfo, I am not getting any canonnamegetaddrinfo,我没有得到任何规范名称
【发布时间】:2013-09-23 22:08:08
【问题描述】:

我正在尝试读取有关特定主机的所有信息并打印出所有信息。 我可以读取并打印出所有地址,但我没有读取任何 ai_canonname!

首先我认为我的示例(www.google.com|www.irs.gov|...)没有佳能名称,但过了一段时间我想我根本没有任何名称。 你认为我做错了什么还是你有一个可行的例子?

这是我的代码,

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <string.h>
#include <sys/time.h>
#include <arpa/inet.h>

int main(int argc, char **argv)
{
    struct addrinfo *result, *rp, hints;
    int error;
    char canonname[32][256];
int canonnum = 0;
char ip[32][64];
int ipnum = 0;
struct timeval tv;
uint64_t starttime, endtime;

if(argc<2)
{
    printf("Usage: %s <address>\n", argv[0]);
    return 0;
}

/* Record Start time */
gettimeofday(&tv, NULL);
starttime = tv.tv_usec;

memset(&hints, 0, sizeof(hints));
memset(canonname, 0, 32*256*sizeof(char));
memset(ip, 0, 32*64*sizeof(char));
hints.ai_socktype = SOCK_STREAM;
hints.ai_family = AF_INET;

error = getaddrinfo(argv[1], NULL, &hints, &result);
if (error != 0)
{   
    if (error == EAI_SYSTEM)
    {
        perror("getaddrinfo");
    }
    else
    {
        fprintf(stderr, "error in getaddrinfo: %s\n", gai_strerror(error));
    }
    return -1;
}
strcpy(canonname[0], "");
if(result->ai_canonname != NULL)
    strcpy(canonname[0], result->ai_canonname);
canonnum++;
for(rp = result; rp != NULL; rp = rp->ai_next) {
    if(rp !=result && rp->ai_canonname != NULL)
    {
        if(strcmp(rp->ai_canonname, "")!=0)
        {
            strcpy(canonname[canonnum],rp->ai_canonname);
            canonnum++;
        }
    }
    struct sockaddr_in *inaddr_ptr;
    if (rp->ai_addr->sa_family == AF_INET)
        inaddr_ptr = (struct sockaddr_in *)rp->ai_addr;
    sprintf(ip[ipnum],"%s\n", inet_ntoa(inaddr_ptr->sin_addr));
    ipnum++;
}

/* Gets the end time and prints out the execution time */
gettimeofday(&tv, NULL);
endtime = tv.tv_usec;
printf("Execution time: %llu milliseconds\n",(endtime - starttime)/100);
printf("Official name: %s\n", canonname[0]);
printf("Aliases:\n");
for(int i=1;i<canonnum;i++)
    printf("%s\n",canonname[i]);
printf("Addresses:\n");
for(int i=0;i<ipnum;i++)
    printf("%s",ip[i]);
freeaddrinfo(result);
return 0;
}

【问题讨论】:

    标签: c++ linux sockets getaddrinfo


    【解决方案1】:

    getaddrinfo() 的规范说你应该添加:

    hints.ai_flags = AI_CANONNAME;
    

    你会得到你想要的。

    $ ./gai www.ibm.com
    Execution time: 4499 milliseconds
    Official name: www.ibm.com
    Aliases:
    Addresses:
    129.42.60.216
    $ ./gai www.google.com
    Execution time: 248 milliseconds
    Official name: www.google.com
    Aliases:
    Addresses:
    74.125.239.50
    74.125.239.49
    74.125.239.48
    74.125.239.52
    74.125.239.51
    $ ./gai www.irs.gov
    Execution time: 2872 milliseconds
    Official name: 63-146-70-67.dia.static.qwest.net
    Aliases:
    Addresses:
    63.146.70.67
    63.146.70.96
    $  ./gai www.irs.gov
    Execution time: 2299 milliseconds
    Official name: 63-146-70-96.dia.static.qwest.net
    Aliases:
    Addresses:
    63.146.70.96
    63.146.70.67
    $
    

    我不知道如何看待 IRS 不断变化的身份。看来,规范并不意味着规范。

    【讨论】:

    • 我还创建了一个这样的示例,并且还获得了没有别名的输出。这意味着,第一个 struct addrinfo 只是正式名称(感谢 AI_CANONNAME),以下是 NULL。 getaddrinfo() 应该替换 gethostbyname()。但是我找不到使用getaddrinfo() 接收别名的方法,因为可以使用gethostbyname()。删除 AI_CANONNAME 会导致与此处问题中所述相同的问题。是否可以使用getaddrinfo() 获取别名?
    猜你喜欢
    • 1970-01-01
    • 2012-02-03
    • 1970-01-01
    • 2013-10-26
    • 1970-01-01
    • 2021-03-04
    • 2014-05-06
    • 1970-01-01
    • 2023-04-01
    相关资源
    最近更新 更多