一、獲取本機(jī)所有可用網(wǎng)卡名
原理:
在 Linux 系統(tǒng)中,/proc 目錄是一個位于內(nèi)存中的偽文件系統(tǒng)。
/proc目錄是內(nèi)核提供給我們的查詢中心,通過查詢該目錄下的文件內(nèi)容,可以獲取到有關(guān)系統(tǒng)硬件及當(dāng)前運行進(jìn)程的信息,如 CPU 信息、負(fù)載信息、系統(tǒng)內(nèi)存信息、磁盤 IO 信息等。
其中文件:/proc/net/dev
,該文件是內(nèi)核維護(hù),所有可用的網(wǎng)口均會同步到該文件中。
/proc/net/dev
peng@ubuntu:~$?cat?/proc/net/dev
Inter-|???Receive????????????????????????????????????????????????|??Transmit
?face?|bytes????packets?errs?drop?fifo?frame?compressed?multicast|bytes????packets?errs?drop?fifo?colls?carrier?compressed
????lo:???26163?????292????0????0????0?????0??????????0?????????0????26163?????292????0????0????0?????0???????0??????????0
??eth0:?285444708??243273????0????0????0?????0??????????0?????????0?91828270???88660????0????0????0?????0???????0??????????0
所以我們要列舉出所有可用的網(wǎng)口名稱,可以通過查看改文件來實現(xiàn),
代碼原理講解
- list_interface_valid()
該函數(shù)用于列舉所有可用的網(wǎng)口
-
- interface_name_cut (char *buf, char **name)
-
- 該函數(shù)用于將從文件
/proc/net/dev
- 中國讀取的每一行字符串信息,提取出網(wǎng)口名信息,如lo、eth0
代碼實現(xiàn)原理如下:
- 函數(shù)strrchr()
該函數(shù)返回一個指針,指向字符串s中最后一個出現(xiàn)的字符c位置。
二、核心代碼如下:
#define?IP_SIZE?128
#define?PROCBUFSIZ??????????????????1024
#define?_PATH_PROC_NET_DEV????????"/proc/net/dev"
static?char?*?interface_name_cut?(char?*buf,?char?**name)
{
??char?*stat;
??/*?Skip?white?space.??Line?will?include?header?spaces.?*/
??while?(*buf?==?'?')
????buf++;
??*name?=?buf;
??/*?Cut?interface?name.?*/
??stat?=?strrchr?(buf,?':');
??*stat++?=?'';
??return?stat;
}
int?list_interface_valid()
{
??FILE?*fp;
??char?buf[PROCBUFSIZ];
??struct?interface?*ifp;
??char?*name;
??char?*p;
?
??/*?Open?/proc/net/dev.?*/
??fp?=?fopen?(_PATH_PROC_NET_DEV,?"r");
??if?(fp?==?NULL)
????{???
????????printf("open?proc?file?errorn");
??????return?-1;?
????}???
?
??/*?Drop?header?lines.?*/
??fgets?(buf,?PROCBUFSIZ,?fp);
??fgets?(buf,?PROCBUFSIZ,?fp);
?
??/*?Only?allocate?interface?structure.??Other?jobs?will?be?done?in
?????if_ioctl.c.?*/
??while?(fgets?(buf,?PROCBUFSIZ,?fp)?!=?NULL)
????{???
??????p?=?interface_name_cut?(buf,?&name);
???printf("port=%sn",name);
????}???
??fclose(fp);
??return?0;
}
運行截圖
完整代碼獲取,【 】公眾號后臺回復(fù):eth