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

标签 c networking network-programming communication

对于两个主机之间的通信,我需要将主机的 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 中的主机名在真实网络地址后面,而不是本地环回(例如 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 个地址信息的列表,但提示阻止了)

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

最佳答案

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

参见man getaddrinfo

关于c - 如何在 C 中获取我的非环回网络 ip 地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3977559/

相关文章:

c - 双链表-C

networking - WireShark轻量级抓包,能做到吗?

ruby - 如何防止 "The connection was reset"错误?

ajax - 我应该使用AJAX还是WebSockets。

c - SNMP如何获取代理并为其设置值

c++ - 转换递归函数并使其迭代

C - Malloc 问题(也许是别的)

c - 将 2 个数组的和存储到一个简单的 int 变量中

networking - 如何在flutter应用程序上计算/获取用户互联网带宽速度

Android volley,如何动态传递post参数