首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么使用节点为NULL和ai_flags作为被动的getaddrinfo会导致IP地址不正确?

为什么使用节点为NULL和ai_flags作为被动的getaddrinfo会导致IP地址不正确?
EN

Stack Overflow用户
提问于 2015-03-26 14:52:09
回答 1查看 1.5K关注 0票数 0

为什么程序将我的IP地址打印为0.0.0.0?如果我指定我的IP地址,它将正确的IP。我阅读了手册页面中关于getaddrinfo的部分,并看到分配AI_PASSIVE和NULL的代码是有效的。那么,这里出了什么问题?

更新:为res和sa分配内存

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <string.h>
#include <sys/types.h>
#include <errno.h>
#include <netdb.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <unistd.h>

#include "../cus_header/cus_header.h"

#define MYPORT "30000"
#define BACKLOG 10


int main(int argc, char *argv[]){

    struct addrinfo hints, *res;
    res = malloc(sizeof(struct addrinfo)); // update here
    char ip4[INET_ADDRSTRLEN];
    struct sockaddr_in *sa;
    sa = malloc(sizeof(struct sockaddr_in)); // update here

    // load up address struct with getaddrinfo
    memset(&hints, 0, sizeof hints);
    hints.ai_family = AF_UNSPEC;
    hints.ai_socktype = SOCK_STREAM;
    hints.ai_flags = AI_PASSIVE;

    if(getaddrinfo(NULL, MYPORT, &hints, &res) == -1){
        error("Cannot get AI");
    }

    sa = (struct sockaddr_in*)res->ai_addr;

    inet_ntop(AF_INET, &(sa->sin_addr), ip4, INET_ADDRSTRLEN);
    printf("The IPv4 address is: %s\n", ip4);

    free(res); // update here
    free(sa); // update here

    return 0;

}
EN

回答 1

Stack Overflow用户

发布于 2019-10-24 14:47:38

根据手册:

代码语言:javascript
复制
man 3 getaddrinfo

如果AI_PASSIVE标志在hints.ai_flags中指定,且节点为NULL,则返回的套接字地址将适合于绑定(2)将接受(2)连接的套接字。返回的套接字地址将包含“通配符地址”(INADDR_ANY表示IPv4地址,IN6ADDR_ANY_INIT表示IPv6地址)。通配符地址由打算在任何主机网络地址上接受连接的应用程序(通常是服务器)使用。如果节点不是NULL,则忽略AI_PASSIVE标志。

因此,0.0.0.0不是一个不正确的地址,而是通配符地址,即主机的任何地址。

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

https://stackoverflow.com/questions/29281614

复制
相关文章

相似问题

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