3

我正在尝试IP Address在我的程序中检索本地机器的。操作系统是Ubuntu 8.10. 我尝试使用gethostname()andgethostbyname()来检索IP Address. 我收到的答案是127.0.1.1。我了解到这似乎是一Debian件事: 此处链接的文档解释了这个想法。

我的/etc/hosts文件内容是:

127.0.0.1 本地主机
127.0.1.1 我的机器

在这种情况下,是否有任何其他方式以编程方式(首选 C 或 C++)在不修改机器上的系统文件的情况下获取 IP 地址?

4

6 回答 6

5

这是一些演示 SIOCGIFCONF 的快速而肮脏的代码:

#include <stdio.h>
#include <stdlib.h>
#include <sys/ioctl.h>
#include <net/if.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int main()
{
    int sock, i;
    struct ifreq ifreqs[20];
    struct ifconf ic;

    ic.ifc_len = sizeof ifreqs;
    ic.ifc_req = ifreqs;

    sock = socket(AF_INET, SOCK_DGRAM, 0);
    if (sock < 0) {
        perror("socket");
        exit(1);
    }

    if (ioctl(sock, SIOCGIFCONF, &ic) < 0) {
        perror("SIOCGIFCONF");
        exit(1);
    }

    for (i = 0; i < ic.ifc_len/sizeof(struct ifreq); ++i)
        printf("%s: %s\n", ifreqs[i].ifr_name,
                inet_ntoa(((struct sockaddr_in*)&ifreqs[i].ifr_addr)->sin_addr));

    return 0;
}

我在我的 Linux 机器上得到以下输出。

lo: 127.0.0.1
br0: 192.168.0.42
dummy1: 10.0.0.2
于 2009-03-31T16:52:15.540 回答
3

所以,根据肯的观点:

ip addr show scope global | grep inet | cut -d' ' -f6 | cut -d/ -f1

遗憾的是,当 Debian 大神们发出“ip”命令时,他们并没有想到添加一个简单的命令来获取 ip 地址。

于 2011-04-23T20:57:00.583 回答
2

请参阅“网络设备”,通过man netdevice在网络上
然后可以使用 SIOCGIFCONF 来获取所有传输层地址的枚举。

编辑(在手册页上):man在 Linux(或其他类似 UNIX 的系统)上是一个非常有用的命令。它显示了对大多数命令、库函数、程序等的简要描述。打开 shell 提示符并键入man lsor man netdevice,你就会明白我的意思了。

编辑(关于 IP 的一般检索):最简单的方法是,如果您认为 C 方法太杂乱,是一个简单的 shell 脚本,例如(只是从我的脑海中):
ifconfig|grep 'inet addr'|awk '{print $2}'|sed 's/addr://g'

编辑(关于 Brain 解决方案):他所做的是使用if_nameindex()函数来查找所有网络设备名称,然后在每个名称上使用 SIOCFIFCONF ioctl 来查找它们的 IP。正如他所说,它只列出了每个设备一个 IP。

于 2009-03-31T14:10:12.090 回答
1

查看netdevice手册页。调用 SIOCGIFCONF 以获取所有接口及其地址的列表。

于 2009-03-31T14:06:39.523 回答
1

谢谢大家的分享!

对于 bash 解决方案,这就是我最终的结果:

#!/bin/bash

/sbin/ifconfig|fgrep 'inet addr:'|fgrep -v '127'|cut -d: -f2|awk '{print $1}'|head -n1

头部确保返回主 IP,因为多宿主和/或逻辑接口也将在没有头部的情况下返回。

因此,如果脚本位于 /sbin/get_primary_ip,您可以执行以下操作:

foo=$(get_primary_ip)
于 2010-10-28T18:37:47.897 回答
1

ifconfig 已过时且已弃用。iproute2 是新堆栈,使用 ip 命令:

ip addr,然后从那里解析。

于 2011-04-23T14:22:31.937 回答