2008-11-03 161 views
4

在Linux機器上,通用接口名稱看起來像eth0,eth1等。我知道如何使用gethostbyname或類似函數找到至少一個IP地址,但我不知道任何方式來指定我想要哪個指定接口的IP地址。我可以使用ifconfig並解析輸出,但是對於這些信息而言,似乎......不夠優雅。從接口名稱查找IP地址

有沒有一種辦法,也就是說,枚舉所有的接口和它們的IP地址(也許MAC地址)到一個集合?或者至少沿着gethostbyinterface("eth0")的方向行事?

+0

請參閱此問題:獲取本地計算機的IP地址(http://stackoverflow.com/questions/212528) – camh 2008-11-04 03:15:10

回答

9

TLUG

#include <sys/types.h> 
#include <sys/socket.h> 
#include <sys/ioctl.h> 
#include <net/if.h> 
#include <netinet/in.h> 
#include <arpa/inet.h> 
#include <string.h> 
#include <stdio.h> 
#include <unistd.h> 

/** 
* getIPv4() 
* 
* This function takes a network identifier such as "eth0" or "eth0:0" and 
* a pointer to a buffer of at least 16 bytes and then stores the IP of that 
* device gets stored in that buffer. 
* 
* it return 0 on success or -1 on failure. 
* 
* Author: Jaco Kroon <[email protected]> 
*/ 
int getIPv4(const char * dev, char * ipv4) { 
    struct ifreq ifc; 
    int res; 
    int sockfd = socket(AF_INET, SOCK_DGRAM, 0); 

    if(sockfd < 0) 
     return -1; 
    strcpy(ifc.ifr_name, dev); 
    res = ioctl(sockfd, SIOCGIFADDR, &ifc); 
    close(sockfd); 
    if(res < 0) 
     return -1;  
    strcpy(ipv4, inet_ntoa(((struct sockaddr_in*)&ifc.ifr_addr)->sin_addr)); 
    return 0; 
} 


int main() { 
    char ip[16]; 
    if(getIPv4("eth0", ip) == 0) 
     printf("IPv4: %s\n", ip); 
    else 
     printf("No IP\n"); 
    return 0; 
} 
+0

當然有一個缺點:打開虛擬套接字。無論如何,工作很好。 – 2008-11-03 18:43:32

3

編輯:我看到你不喜歡炮擊。然後你可以看看ifconfig如何完成它的工作(它至少從/ proc中提取了一些信息)。

當你有接口的名稱,你可以這樣做(在你的shell):

ifconfig eth0 | grep 'inet addr' | sed -e 's/:/ /' | awk '{print $3}' 

枚舉接口,你可以使用這個:

ifconfig | egrep '^[^ ]' | awk '{print $1}' 

組合:

for x in `ifconfig | egrep '^[^ ]' | awk '{print $1}'`; do 
    echo -n "${x}" 
    echo -n " " 
    ifconfig "${x}" | grep 'inet addr' | sed -e 's/:/ /' | awk '{print $3}' 
done