Linux下如何獲取網絡卡資訊

2021-06-06 03:07:55 字數 3813 閱讀 8461

有時候,寫程式的時候需要獲取計算機的網路資訊,比如ip位址、電腦名稱、dns等資訊。ip位址和電腦名稱是比較容易獲取到的,而要想獲取位址掩碼、dns、閘道器等資訊就有些麻煩了。

在windows下我們一般都是通過從登錄檔讀取這些資訊。在linux怎麼做呢?其實,linux下更加容易一些。因為我們可以拿現成的程式看它的源**。通過閱讀其源**找到解決該問題的方法。那麼,看哪個程式的源**呢?如果你使用過linux,並且比較熟悉的話就肯定知道乙個命令ifconfig。這個命令和windows下的ipconfig差不多,都可以輸出網絡卡的資訊,其中就包含dns、掩碼等資訊。所以,我們可以通過看它的源**來找到解決該問題的方法。

並沒有那個系統呼叫提供網絡卡數量的獲取。但是,我們可以通過強大的proc檔案系統獲取網絡卡數量的資訊。實際上,ifconfig也是這樣做的,請看示例**如下:
0001 #include
0002 #include
0003 #include
0004
0005 int getnetcardcount()
0006
0014
0015     char szline[512];
0016
0017     fgets(szline, sizeof(szline), f);    /* eat line */
0018     fgets(szline, sizeof(szline), f);
0019
0020     while(fgets(szline, sizeof(szline), f))
0021     ;
0023         sscanf(szline, "%s", szname);
0024         int nlen = strlen(szname);
0025         if (nlen <= 0)continue;
0026         if (szname[nlen - 1] == ':') szname[nlen - 1] = 0;
0027         if (strcmp(szname, "lo") == 0)continue;
0028         ncount++;
0029     }
0030
0031     fclose(f);
0032     f = null;
0033     return ncount;
0034 }
0035
0036 int main(int argc, char* argv)
0037
0001 void dispnetinfo(const char* szdevname)
0002
0009
0010     struct ifreq ifr;
0011     unsigned char mac[6];
0012     unsigned long nip, nnetmask, nbroadip;
0013
0014     printf("%s:\n", szdevname);
0015
0016     strcpy(ifr.ifr_name, szdevname);
0017     if (ioctl(s, siocgifhwaddr, &ifr) < 0)
0018
0021     memcpy(mac, ifr.ifr_hwaddr.sa_data, sizeof(mac));
0022     printf("\tmac: %02x-%02x-%02x-%02x-%02x-%02x\n",
0023             mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
0024
0025     strcpy(ifr.ifr_name, szdevname);
0026     if (ioctl(s, siocgifaddr, &ifr) < 0)
0027
0030     else
0031
0034     printf("\tip: %s\n", inet_ntoa(*(in_addr*)&nip));
0035
0036     strcpy(ifr.ifr_name, szdevname);
0037     if (ioctl(s, siocgifbrdaddr, &ifr) < 0)
0038
0041     else
0042
0045     printf("\tbroadip: %s\n", inet_ntoa(*(in_addr*)&nbroadip));
0046
0047     strcpy(ifr.ifr_name, szdevname);
0048     if (ioctl(s, siocgifnetmask, &ifr) < 0)
0049
0052     else
0053
0056     printf("\tnetmask: %s\n", inet_ntoa(*(in_addr*)&nnetmask));
0057     close(s);
0058 }
res_init();      

for (int i = 0; i < _res.nscount; i++)

struct sockaddr* server = (structsockaddr*)&_res.nsaddr_list[i];

printf("server:  %s\n", inet_ntoa(*(in_addr*)&(server->sa_data[2])));

**很簡單,就不做解釋了。

怎麼獲取閘道器呢?這個稍微有點麻煩一些,不過和獲取網絡卡數量相似,都是通過proc檔案系統。這次分析的/proc/net/route檔案。我就不再貼出示例**了。

eth0:

mac: 08-00-27-98-bf-f3

ip: 192.168.1.106

broadip: 255.255.255.255

netmask: 255.255.255.0

gateway: 192.168.1.1

eth1:

mac: 08-00-27-16-f4-bf

ip: 192.168.1.108

broadip: 192.168.1.255

netmask: 255.255.255.0

gateway: 0.0.0.0

eth2:

mac: 08-00-27-37-9c-91

ip: 0.0.0.0

broadip: 0.0.0.0

netmask: 0.0.0.0

gateway: 0.0.0.0

eth3:

mac: 08-00-27-5a-d2-39

ip: 0.0.0.0

broadip: 0.0.0.0

netmask: 0.0.0.0

gateway: 0.0.0.0

netcardcount: 4

dns 0:  218.2.135.1

dns 1:  61.147.37.1

Linux下獲取多網絡卡資訊

支援多網絡卡,主要是使用ioctl函式系統呼叫實現,通過指定裝置名實現指定功能.之前使用socket 函式,獲取檔案描述符.在此基礎可以很輕鬆的擴充套件,如獲取net mask,mac address等 include stdio.h include sys types.h include sys ...

linux 獲取網絡卡資訊

sar n dev 2 10 41 37 am iface rxpck s txpck s rxkb s txkb s rxcmp s txcmp s rxmcst s 10 41 39 am eth0 1.50 1648.00 0.15 117.54 0.00 0.00 1.00 10 41 39...

Linux下獲取所有可用網絡卡資訊

在linux 下開發網路程式時,經常會遇到需要取本地網路介面名 ip 廣播位址 子網掩碼或者mac位址等資訊的需求,最常見的辦法是配合巨集siocgifhwaddr siocgifaddr siocgifbrdaddr與siocgifnetmask作為引數呼叫函式 ioctl分別獲得mac位址 ip...