有時候,寫程式的時候需要獲取計算機的網路資訊,比如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...