Linux下獲取網絡接口ip地址


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;
   };

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM