Linux 下 可以使用ioctl()函數以及結構體 struct ifreq和結構體struct ifconf來獲取網絡接口的各種信息。
如圖,有br0和br1兩個接口,當前需要獲取br1的ip地址(當然其他接口信息如mac、子網掩碼等都可以),方法如下:
具體過程是先通過ictol獲取本地的所有接口信息,存放到ifconf結構中,再從其中取出每個ifreq表示的ip信息(一般每個網卡對應一個IP地址,如:”eth0…、eth1…”)。
頭文件:
1 #include <arpa/inet.h> 2 #include <net/if.h> 3 #include <sys/ioctl.h> 4 #include <sys/socket.h>
代碼:
1 static int lanGetBr1IpAddr(const char *ifName, char *ipAddr, UINT32 addrLen) 2 { 3 int ret = -1; 4 struct ifreq ifr; 5 struct sockaddr_in *sin; 6 int sock; 7 8 printf("ifname:%s", ifr.ifr_name); 9 sock = socket(AF_INET, SOCK_DGRAM, 0); 10 strncpy(ifr.ifr_name, ifName, sizeof(ifr.ifr_name)); 11 12 if (0 > (ret = ioctl(sock, SIOCGIFADDR, &ifr))) 13 { 14 printf("ioctl get SIOCGIFADDR failed!!"); 15 return -1; 16 } 17 close(sock); 18 19 sin = (struct sockaddr_in *)&(ifr.ifr_addr); 20 if (NULL == inet_ntoa(sin->sin_addr)) 21 { 22 return -1; 23 } 24 strncpy(ipAddr, inet_ntoa(sin->sin_addr), addrLen); 25 26 return ret; 27 }
獲取成功存入數據庫並給前台:
寫這段代碼的時候遇到個小問題,本來想打印未經轉換的IP地址 sin_addr,一直不成功,實際上這時候的地址是整型
typedef
uint32_t in_addr_t;
struct
in_addr
{
in_addr_t s_addr;
};