我正在尝试在程序中检索本地计算机的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地址而不修改机器上的系统文件?
答案 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 netdevice
或on the web查看“netdevice”
然后可以使用SIOCGIFCONF获取所有传输层地址的枚举。
编辑(在联机帮助页上):man
在Linux(或其他类UNIX系统)上是一个非常有用的命令。它显示了大多数命令,库函数,程序等的简要说明。打开shell提示符并键入man ls
或man 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,并从那里解析。