首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Linux网络编程:getaddrinfo()得到错误的结果

Linux网络编程:getaddrinfo()得到错误的结果
EN

Stack Overflow用户
提问于 2012-03-11 07:00:58
回答 2查看 1.2K关注 0票数 1

这是一个简单的程序,我写它是为了找出一个域的所有A record

我把它复杂化了,没有错误,也没有警告。

然后我运行它,我只发现它给出了错误的IP,例如:

./a.out www.google.com

2.0.0.0

2.0.0.0

这是我的密码:

代码语言:javascript
运行
复制
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netdb.h>

int main(int argc, char *argv[])
{
    struct addrinfo addrC;
    struct addrinfo *addrL;
    struct addrinfo *temp;

    memset(&addrC, 0, sizeof(addrC));
    addrC.ai_family = AF_INET;
    addrC.ai_socktype = SOCK_STREAM;
    addrC.ai_protocol = IPPROTO_TCP;

    if (getaddrinfo(argv[1], "http", &addrC, &addrL) != 0)
    {
        perror("getaddrinfo!");
        exit(1);
    }

    for (temp = addrL; temp != NULL; temp = temp->ai_next)
    {
        char addrBuf[BUFSIZ];
        void *addrCount = &((struct sockaddr_in*)temp)->sin_addr;
        inet_ntop(temp->ai_addr->sa_family, addrCount, addrBuf, sizeof(addrBuf));
        printf("%s\n", addrBuf);
    }
    for (temp = addrL; temp != NULL; temp = addrL)
    {
        addrL = temp->ai_next;
        free(temp);
    }
    return 0;
}

为什么?如何纠正呢?

EN

回答 2

Stack Overflow用户

发布于 2012-03-11 07:50:11

在循环内的指针转换中有一个错误,它应该是:

代码语言:javascript
运行
复制
void *addrCount = &((struct sockaddr_in*)temp->ai_addr)->sin_addr;

否则,您将读取垃圾并将该垃圾传递给inet_ntop,因此您将得到垃圾:)

票数 1
EN

Stack Overflow用户

发布于 2012-03-11 10:48:36

另一个答案是正确的,但我建议使用getnameinfo (使用NI_NUMERICHOST)而不是inet_ntop。这样你就不会有这个错误了。

另外,不应该循环并将结果从getaddrinfo中释放出来。调用freeaddrinfo来释放整个数组。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9653080

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档