首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >返回通配符地址的Getaddrinfo(),尽管没有设置AI_PASSIVE

返回通配符地址的Getaddrinfo(),尽管没有设置AI_PASSIVE
EN

Stack Overflow用户
提问于 2017-11-04 08:53:46
回答 1查看 201关注 0票数 0

从getaddrinfo()的手册页面..。

如果AI_PASSIVE标志未在hints.ai_flags中设置,则返回的套接字地址将适合与connect(2)、sendto(2)或sendmsg(2)一起使用。

但是我要把0.0.0.0还给一些网站。我不应该知道通配符地址吗?

代码语言:javascript
复制
void checkAddresses(char * addrName)
{
    struct addrinfo hints;
    struct addrinfo * infoptr = 0;
    struct addrinfo * node = 0;
    int gai_return = 0;
    int socket_fd = 0;
    int gni_return = 0;
    char host_buffer[255] = { 0 };
    struct sockaddr_in * h = 0;

    memset(host_buffer, 0, sizeof(host_buffer));

    memset(&hints, 0, sizeof(hints));
    hints.ai_family = AF_UNSPEC;
    hints.ai_socktype = SOCK_DGRAM;
    hints.ai_flags = 0;
    hints.ai_protocol = 0;
    hints.ai_canonname = NULL;
    hints.ai_addr = NULL;
    hints.ai_next = NULL;

    gai_return = getaddrinfo(addrName, 0, &hints, &infoptr);
    if(gai_return != 0)
    {
        perror("Getaddrinfo() failure");
        exit(1);
    }

    for (node = infoptr; node != NULL; node = node->ai_next)
    {
        h = (struct sockaddr_in *) node->ai_addr;
        strcpy(host_buffer, inet_ntoa(h->sin_addr));
        puts(host_buffer);
    }

    freeaddrinfo(infoptr);
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-04 08:58:00

您指定了AF_UNSPEC,这意味着未指定的地址家族。Now,这意味着您将得到AF_INETAF_INET6。如果你只想要AF_INET,那么请说出来。

请注意,特别是在查找localhost时,IPv6 address ::1将具有二进制表示形式

代码语言:javascript
复制
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01

现在,如果您将前4个字节重新解释为IPv4地址(如果您将指针转换为struct sockaddr_in *).

使用AF_UNSPEC,您必须检查node->ai_family;它将是用于IPv4套接字的AF_INET和用于IPv6的AF_INET6 --可能还有其他的东西。

但是,请注意,大多数情况下,您根本不会检查地址--没有必要。相反,您只需将uncast struct sockaddr *ai_addr以这样的方式传递给sendto (对于UDP套接字)。

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

https://stackoverflow.com/questions/47109062

复制
相关文章

相似问题

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