当前位置:  开发笔记 > 运维 > 正文

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

如何解决《如何在C中获取我的非环回网络IP地址?》经验,为你挑选了1个好方法。

对于两台主机之间的通信,我需要将主机的IP地址发送到另一个站点.问题是,如果我请求我的IP地址,可能是我恢复了我的本地环回IP地址(127.xxx),而不是网络(以太网)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中的主机名在真实网络地址后面,而不是本地环回(例如Ubuntu的默认值).

有没有办法解决这个问题而不依赖于/ 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_STREAM,SOCK_DGRAM和SOCK_RAW取回了3个addrinfo的列表,但提示阻止了这个)

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



1> qrdl..:

POSIX函数getaddrinfo()返回给定主机名的地址链表,因此您只需要查看该列表并找到非环回地址.

man getaddrinfo.

推荐阅读
pan2502851807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有