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.mzph.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视频太炫酷&…