linux如何獲取網卡計數信息,Linux下如何獲取網卡信息

有時候,寫程序的時候需要獲取計算機的網絡信息,比如IP地址、電腦名稱、DNS等信息。IP地址和電腦名稱是比較容易獲取到的,而要想獲取地址掩碼、DNS、網關等信息就有些麻煩了。

在Windows下我們一般都是通過從注冊表讀取這些信息。在Linux怎么做呢?其實,Linux下更加容易一些。因為我們可以拿現成的程序看它的源代碼。通過閱讀其源代碼找到解決該問題的方法。那么,看哪個程序的源代碼呢?如果你使用過Linux,并且比較熟悉的話就肯定知道一個命令ifconfig。這個命令和Windows下的ipconfig差不多,都可以輸出網卡的信息,其中就包含DNS、掩碼等信息。所以,我們可以通過看它的源代碼來找到解決該問題的方法。

獲取系統中的網卡數量 并沒有那個系統調用提供網卡數量的獲取。但是,我們可以通過強大的proc文件系統獲取網卡數量的信息。實際上,ifconfig也是這樣做的,請看示例代碼如下:

#include

#include

#include

int GetNetCardCount()

{

int nCount = 0;

FILE* f = fopen("/proc/net/dev", "r");

if (!f)

{

fprintf(stderr, "Open /proc/net/dev failed!errno:%d\n", errno);

return nCount;

}

char szLine[512];

fgets(szLine, sizeof(szLine), f); /* eat line */

fgets(szLine, sizeof(szLine), f);

while(fgets(szLine, sizeof(szLine), f))

{

char szName[128] = {0};

sscanf(szLine, "%s", szName);

int nLen = strlen(szName);

if (nLen <= 0)continue;

if (szName[nLen - 1] == ':') szName[nLen - 1] = 0;

if (strcmp(szName, "lo") == 0)continue;

nCount++;

}

fclose(f);

f = NULL;

return nCount;

}

int main(int argc, char* argv[])

{

printf("NetCardCount: %d\n", GetNetCardCount());

return 0;

}

獲取IP、掩碼、MAC及網關 獲取IP、掩碼、MAC和廣播地址是比較容易的,只需要調用對應的IOCTL即可。只是大家對Linux下的IOCTL可能不太熟悉。卻看示例代碼:

void DispNetInfo(const char* szDevName)

{

int s = socket(AF_INET, SOCK_DGRAM, 0);

if (s < 0)

{

fprintf(stderr, "Create socket failed!errno=%d", errno);

return;

}

struct ifreq ifr;

unsigned char mac[6];

unsigned long nIP, nNetmask, nBroadIP;

printf("%s:\n", szDevName);

strcpy(ifr.ifr_name, szDevName);

if (ioctl(s, SIOCGIFHWADDR, &ifr) < 0)

{

return;

}

memcpy(mac, ifr.ifr_hwaddr.sa_data, sizeof(mac));

printf("\tMAC: %02x-%02x-%02x-%02x-%02x-%02x\n",

mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);

strcpy(ifr.ifr_name, szDevName);

if (ioctl(s, SIOCGIFADDR, &ifr) < 0)

{

nIP = 0;

}

else

{

nIP = *(unsigned long*)&ifr.ifr_broadaddr.sa_data[2];

}

printf("\tIP: %s\n", inet_ntoa(*(in_addr*)&nIP));

strcpy(ifr.ifr_name, szDevName);

if (ioctl(s, SIOCGIFBRDADDR, &ifr) < 0)

{

nBroadIP = 0;

}

else

{

nBroadIP = *(unsigned long*)&ifr.ifr_broadaddr.sa_data[2];

}

printf("\tBroadIP: %s\n", inet_ntoa(*(in_addr*)&nBroadIP));

strcpy(ifr.ifr_name, szDevName);

if (ioctl(s, SIOCGIFNETMASK, &ifr) < 0)

{

nNetmask = 0;

}

else

{

nNetmask = *(unsigned long*)&ifr.ifr_netmask.sa_data[2];

}

printf("\tNetmask: %s\n", inet_ntoa(*(in_addr*)&nNetmask));

close(s);

}

那么如何獲取網關地址呢?更加容易,但是,好像很少有人知道。反正我在網上沒有找到有人知道。最后看了nslookup的源代碼以后才知道正確的做法。代碼如下:

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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/287190.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/287190.shtml
英文地址,請注明出處:http://en.pswp.cn/news/287190.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Redis命令總結

1.用腳本批量刪除key redis-cli -h 127.0.0.1 keys "MAIN:GAME:GID:*" | xargs redis-cli -h 127.0.0.1 del轉載于:https://www.cnblogs.com/hiwen/p/4900968.html

可以只讀的 ServiceCollection

可以只讀的 ServiceCollectionIntro在 .NET 7 Preview 4 中&#xff0c;ServiceCollection 可以聲明為只讀了&#xff0c;這使得我們可以有效避免在構建了 ServiceProvider 之后再新增服務&#xff0c;導致服務注冊失敗。Sample在新的版本中&#xff0c;ServiceCollection 新增…

阿里云與中國聯通首個公共云平臺上線

11月8日&#xff0c;阿里云與中國聯通關于公共云合作的首個項目&#xff1a;浙江聯通“沃云Powered by Alibaba cloud” 平臺&#xff08;cloud.10010zj.com.cn&#xff09;正式發布上線。該平臺將以沃云品牌為客戶提供“阿里云聯通”服務&#xff0c;結合阿里云技術及浙江聯通…

IBM X System ServerGuide 8.41 服務器 系統安裝 引導盤

IBM X System ServerGuide 8.41 支持操作系統: 32位: Microsoft Windows 2003/2003 R2 (Enterprise, Standard, Web and DataCenter UV) Microsoft Small Business Server 2003/2003 R2 (Standard/Premium Edition) Microsoft Windows 2008 (Enterprise, Standard, Web and Dat…

Matlab R2018b簡體中文版完整安裝圖文教程(附安裝包下載)

目 錄 一、安裝過程 二、下載地址 matlab R2018b安裝包如下所示,包括主程序和補丁文件兩部分。 一、安裝過程 雙擊安裝包中的setup.exe。 選擇使用文件安裝MIYAO,點擊下一步。

Android之解決Android10.0通過熱點名字和密碼連接指定熱點網絡不能通信問題(2種解決辦法)

1 問題 Android10.0設備通過熱點名字和密碼連接另外一臺設置指定熱點,但是他們之間依然不能通信,網絡不可達。 Android10.0設備通過熱點名字和密碼連接另外一臺設置指定熱點,我用的是官方API,可以參考我的這篇博客 Android之通過用戶名和密碼連接指定wifi熱點(兼容Android…

《看聊天記錄都學不會C語言?太菜了吧》(20)(必懂!題解)我能知道2000年后的這個月一共有幾天

若是大一學子或者是真心想學習剛入門的小伙伴可以私聊我&#xff0c;若你是真心學習可以送你書籍&#xff0c;指導你學習&#xff0c;給予你目標方向的學習路線&#xff0c;無套路&#xff0c;博客為證。 本系列文章將會以通俗易懂的對話方式進行教學&#xff0c;對話中將涵蓋…

linux nginx線程池,nginx使用線程池提升9倍性能

眾所周知nginx使用異步&#xff0c;事件驅動方法處理連接。這意味著nginx使用一個worker進程處理多個連接和請求&#xff0c;而不是每一個請求有一個專門的進程或著線程處理(像傳統架構的服務器那樣&#xff0c;例如apache)。為了實現這個目的&#xff0c;nginx使用非阻塞模式的…

android 開源項目

https://github.com/Trinea/android-open-project http://a.codekk.com/轉載于:https://www.cnblogs.com/syjhsgcc/p/4902885.html

【空間數據庫】ArcSDE 10.7+SQLEXPRESS+ArcServer 10.7.ecp企業級數據庫環境搭建

作者一直使用的是ArcGIS10.6做空間數據庫相關工作,可以參照文章《ArcGIS 10.6 Database_Server_Desktop安裝、連接數據庫服務、創建企業級數據庫》。今天我們演示安裝ArcGIS10.7自帶的數據庫服務(SQL Server 2014 Express版本)、連接數據庫服務和創建數據庫。 一、軟件準備 …

Android之解決androidx.appcompat.widget.Toolbar去掉左邊距

1 問題 androidx.appcompat.widget.Toolbar默認左邊有間距 2 解決辦法 在Toolbar下面添加如下熟悉 app:contentInsetLeft"0dp"app:contentInsetStart"0dp"app:contentInsetEnd"0dp"app:maxButtonHeight"20dp"app:titleMargin"0…

C# 配置日志記錄

在 .NET Core 中&#xff0c;可以給配置文件使用提供程序&#xff0c;例如從 JSON 或 XML文件、環境變量或命令行參數中讀取配置。只需要從 NuGet 包 Microsoft.ExtensionsConfiguration 中創建一個ConfigurationBuilder&#xff0c;并向此構建器添加提供程序。要添加 JSON 提供…

使用“using” 的 “Cursor”

很多時候&#xff0c;我們會寫下面的這段代碼&#xff1a; private void button1_Click(object sender, EventArgs e) {Cursor cursor Cursor.Current;this.Cursor Cursors.WaitCursor;LongTimeMethod();this.Cursor cursor; }private void LongTimeMethod() {for (int i 0…

《看聊天記錄都學不會C語言?太菜了吧》(21)(必懂!題解)在現實生活中,打擂臺比賽爭名次竟用的是冒泡排序?

若是大一學子或者是真心想學習剛入門的小伙伴可以私聊我&#xff0c;若你是真心學習可以送你書籍&#xff0c;指導你學習&#xff0c;給予你目標方向的學習路線&#xff0c;無套路&#xff0c;博客為證。 本系列文章將會以通俗易懂的對話方式進行教學&#xff0c;對話中將涵蓋…

ArcGIS 10.7如何獲取矢量多邊形所有折點的坐標(平面坐標和經緯度坐標)?

Descriptions:As shown in the figure below is a surface pattern spot, how to obtain the coordinates of each vertex (plane coordinates and latitude and longitude coordinates)? The results we want are as follows: Via data source,we get the information that…

Mahout分類算法學習之實現Naive Bayes分類示例

1.簡介 (1) 貝葉斯分類器的分類原理發源于古典概率理論&#xff0c;是通過某對象的先驗概率&#xff0c;利用貝葉斯公式計算出其后驗概率&#xff0c;即該對象屬于某一類的概率&#xff0c;選擇具有最大后驗概率的類作為該對象所屬的類。樸素貝葉斯分類器(Naive Bayes Classifi…

linux重新做yum,Linux 系統 Centos 7.7 下重裝yum

0. 背景不小心誤刪除yum后&#xff0c;開始想辦法重新安裝。1. 重裝 yum1.1 步驟需要下面4個包&#xff0c;我們需要下載到它們yum-metadata-parserpython-iniparseyum-plugin-fastestmirroryum-3.4.3下載后&#xff0c;安裝它們。1.2 去哪里下載&#xff1f;當然&#xff0c;搜…

jenkins2 groovy語法

文章來自&#xff1a;http://www.ciandcd.com文中的代碼來自可以從github下載&#xff1a; https://github.com/ciandcd安裝&#xff1a;wget https://dl.bintray.com/groovy/maven/apache-groovy-binary-2.4.7.zipunzip apache-groovy-binary-2.4.7.zipsudo ln -s /home/osbox…

Android之glide加載圖片圓角效果

1 問題 Android加載圖片需要圓角化,有什么簡單粗暴的方法嗎?當然有,用我們的神器glide 2 解決辦法 1)簡單辦法 ImageView imageView = (ImageView)helper.getView(R.id.keepHomeAppImageview);Glide.with(mContext).asBitmap().load(iconUrl) // .ov…

一維條形碼***技術(Badbarcode)

【轉】http://future-sec.com/badbarcode.html 前言在日常生活中&#xff0c;條形碼隨處可見&#xff0c;特別在超市&#xff0c;便利店&#xff0c;物流業&#xff0c;但你們掃的條形碼真的安全嗎&#xff1f;之前TK教主在PacSec介紹的條形碼攻擊和twitter上的demo視頻太炫酷&…