如何在基于Debian的系统上以编程方式获取IP地址?

时间:2009-03-31 13:38:51

标签: c ip-address debian

我正在尝试在程序中检索本地计算机的IP Address。操作系统为Ubuntu 8.10。我尝试使用gethostname()gethostbyname()来检索IP Address。我收到的答案是127.0.1.1。我了解到它似乎是一个Debian的东西: The document linked here explained the idea.

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

  

127.0.0.1 localhost
  127.0.1.1 mymachine

在这种情况下,有没有其他方式以编程方式(更喜欢C或C ++)获取IP地址而不修改机器上的系统文件?

6 个答案:

答案 0 :(得分: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

答案 1 :(得分:3)

所以,按照肯的观点:

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

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

答案 2 :(得分:2)

通过man netdeviceon the web查看“netdevice” 然后可以使用SIOCGIFCONF获取所有传输层地址的枚举。

编辑(在联机帮助页上):man在Linux(或其他类UNIX系统)上是一个非常有用的命令。它显示了大多数命令,库函数,程序等的简要说明。打开shell提示符并键入man lsman netdevice,您将看到我的意思。

编辑(一般检索IP):最简单的方法,如果你认为C方式太乱了,就像一个简单的shell脚本(就在我的脑海中): ifconfig|grep 'inet addr'|awk '{print $2}'|sed 's/addr://g'

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

答案 3 :(得分:1)

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

答案 4 :(得分:1)

感谢所有人的分享!

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

#!/bin/bash

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

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

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

foo=$(get_primary_ip)

答案 5 :(得分:1)

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

ip addr,并从那里解析。