代码之家  ›  专栏  ›  技术社区  ›  Roalt

如何在C中获取我的非环回网络ip地址?

  •  3
  • Roalt  · 技术社区  · 17 年前

    对于两台主机之间的通信,我需要将主机的IP地址发送到另一个站点。问题是,如果我请求我的IP地址,我可能会返回我的本地环回IP地址(127.x.x.x),而不是网络(以太网)IP地址。

    我使用以下代码:

    char myhostname[32];
    
    
    gethostname(myhostname, 32);
    hp = gethostbyname(myhostname);
    unsigned my_ip = *(unsigned*)(hp->h_addr);
    
    if( (my_ip % 256) == 127) {
      /* Wrong IP adress as it's 127.x.x.x */
      printf("Error, local IP address!");
      return;
    }
    

    有没有一种方法可以在不依赖/etc/hosts内容的情况下解决这个问题?

    我更改了上面的代码,使其使用getaddrinfo,但我仍然返回环回设备的编号(127.0,0,1),而不是实际的IP地址:

    struct addrinfo hint = {0};
    struct addrinfo *aip = NULL;
    unsigned ip = 0;
    struct sockaddr_in *sinp = NULL;
    
    hint.ai_family = AF_INET; /* IPv4 */
    hint.ai_socktype = SOCK_STREAM;
    
    if(getaddrinfo(hostname, NULL, &hint, &aip) != 0) {
        return 0;
    }
    sinp = (struct sockaddr_in *) aip->ai_addr;
    ip   = *(unsigned *) &sinp->sin_addr;
    

    (我过去经常用三个SOCK_流、SOCK_DGRAM和SOCK_RAW返回3个addrinfo的列表,但提示阻止了这一点)

    所以我的问题仍然存在。。。

    10 回复  |  直到 17 年前