[英]How to get IP address programmatically on Debian based system?
我正在嘗試在我的程序中檢索本地計算機的IP Address
。 操作系統是Ubuntu 8.10
。 我嘗試使用gethostname()
和gethostbyname()
來檢索IP Address
。 我收到的答案是127.0.1.1
。 我了解到這似乎是Debian
的事情: 此處鏈接的文檔解釋了這個想法。
我的/etc/hosts
文件的內容是:
127.0.0.1 本地主機
127.0.1.1 我的機器
在這種情況下,是否有任何其他方式可以在不修改機器上的系統文件的情況下以編程方式(首選 C 或 C++)獲取 IP 地址?
這是一些演示 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 機器上得到以下 output。
lo: 127.0.0.1
br0: 192.168.0.42
dummy1: 10.0.0.2
所以,根據肯的觀點:
ip addr show scope global | grep inet | cut -d' ' -f6 | cut -d/ -f1
遺憾的是,當 Debian 大神發出“ip”命令時,他們並沒有想到添加一個簡單的命令來獲取 ip 地址。
通過man netdevice
或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'
編輯(關於大腦解決方案):他所做的是使用if_nameindex() function 來查找所有網絡設備名稱,然后在每個名稱上使用 SIOCFIFCONF ioctl 來查找它們的 IP。 正如他所說,它只列出了每個設備一個 IP。
謝謝大家的分享!
對於 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)
ifconfig 已過時且已棄用。 iproute2 是新堆棧,使用 ip 命令:
ip 地址,然后從那里解析。
查看netdevice手冊頁。 調用 SIOCGIFCONF 以獲取所有接口及其地址的列表。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.