Linux下如何获取网卡信息
来源:互联网 发布:淘宝福袋退货 编辑:程序博客网 时间:2024/06/17 14:59
杂谈
分类: Linux/Unix有时候,写程序的时候需要获取计算机的网络信息,比如IP地址、电脑名称、DNS等信息。IP地址和电脑名称是比较容易获取到的,而要想获取地址掩码、DNS、网关等信息就有些麻烦了。
在Windows下我们一般都是通过从注册表读取这些信息。在Linux怎么做呢?其实,Linux下更加容易一些。因为我们可以拿现成的程序看它的源代码。通过阅读其源代码找到解决该问题的方法。那么,看哪个程序的源代码呢?如果你使用过Linux,并且比较熟悉的话就肯定知道一个命令ifconfig。这个命令和Windows下的ipconfig差不多,都可以输出网卡的信息,其中就包含DNS、掩码等信息。所以,我们可以通过看它的源代码来找到解决该问题的方法。
获取系统中的网卡数量
并没有那个系统调用提供网卡数量的获取。但是,我们可以通过强大的proc文件系统获取网卡数量的信息。实际上,ifconfig也是这样做的,请看示例代码如下:
0001#include <stdio.h>
0002#include <string.h>
0003#include <errno.h>
0004
0005int GetNetCardCount()
0006{
0007int nCount = 0;
0008FILE* f = fopen("/proc/net/dev", "r");
0009if (!f)
0010{
0011fprintf(stderr, "Open /proc/net/dev failed!errno:%dn", errno);
0012return nCount;
0013}
0014
0015char szLine[512];
0016
0017fgets(szLine, sizeof(szLine), f);
0018fgets(szLine, sizeof(szLine), f);
0019
0020while(fgets(szLine, sizeof(szLine), f))
0021{
0022char szName[128] = {0};
0023sscanf(szLine, "%s", szName);
0024int nLen = strlen(szName);
0025if (nLen <= 0)continue;
0026if (szName[nLen - 1] == ':') szName[nLen - 1] = 0;
0027if (strcmp(szName, "lo") == 0)continue;
0028nCount++;
0029}
0030
0031fclose(f);
0032f = NULL;
0033return nCount;
0034}
0035
0036int main(int argc, char* argv[])
0037{
0038printf("NetCardCount: %dn", GetNetCardCount());
0039return 0;
0040}
获取IP、掩码、MAC及网关
获取IP、掩码、MAC和广播地址是比较容易的,只需要调用对应的IOCTL即可。只是大家对Linux下的IOCTL可能不太熟悉。却看示例代码:
0001void DispNetInfo(const char* szDevName)
0002{
0003int s = socket(AF_INET, SOCK_DGRAM, 0);
0004if (s < 0)
0005{
0006fprintf(stderr, "Create socket failed!errno=%d", errno);
0007return;
0008}
0009
0010struct ifreq ifr;
0011unsigned char mac[6];
0012unsigned long nIP, nNetmask, nBroadIP;
0013
0014printf("%s:n", szDevName);
0015
0016strcpy(ifr.ifr_name, szDevName);
0017if (ioctl(s, SIOCGIFHWADDR, &ifr) < 0)
0018{
0019return;
0020}
0021memcpy(mac, ifr.ifr_hwaddr.sa_data, sizeof(mac));
0022printf("tMAC: x-x-x-x-x-xn",
0023mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
0024
0025strcpy(ifr.ifr_name, szDevName);
0026if (ioctl(s, SIOCGIFADDR, &ifr) < 0)
0027{
0028nIP = 0;
0029}
0030else
0031{
0032nIP = *(unsigned long*)&ifr.ifr_broadaddr.sa_data[2];
0033}
0034printf("tIP: %sn", inet_ntoa(*(in_addr*)&nIP));
0035
0036strcpy(ifr.ifr_name, szDevName);
0037if (ioctl(s, SIOCGIFBRDADDR, &ifr) < 0)
0038{
0039nBroadIP = 0;
0040}
0041else
0042{
0043nBroadIP = *(unsigned long*)&ifr.ifr_broadaddr.sa_data[2];
0044}
0045printf("tBroadIP: %sn", inet_ntoa(*(in_addr*)&nBroadIP));
0046
0047strcpy(ifr.ifr_name, szDevName);
0048if (ioctl(s, SIOCGIFNETMASK, &ifr) < 0)
0049{
0050nNetmask = 0;
0051}
0052else
0053{
0054nNetmask = *(unsigned long*)&ifr.ifr_netmask.sa_data[2];
0055}
0056printf("tNetmask: %sn", inet_ntoa(*(in_addr*)&nNetmask));
0057close(s);
0058}
代码很简单,就不做解释了。
怎么获取网关呢?这个稍微有点麻烦一些,不过和获取网卡数量相似,都是通过proc文件系统。这次分析的/proc/net/route文件。我就不再贴出示例代码了。
最后,我把运行示例程序获取到的信息附上,以供大家有个直观的认识:
eth0:
Gateway: 192.168.1.1
eth1:
Gateway: 0.0.0.0
eth2:
Gateway: 0.0.0.0
eth3:
Gateway: 0.0.0.0
NetCardCount: 4
DNS 0:
DNS 1:
linux 下查看网卡工作速率
[root@localhost ~]#
eth0: negotiated 100baseTx-FD, link ok 100M
linux 下查看网卡工作速率
Ethtool是用于查询及设置网卡参数的命令。
概要:
ethtool ethX //查询ethX网口基本设置
ethtool –h //显示ethtool的命令帮助(help)
ethtool –i ethX //查询ethX网口的相关信息
ethtool –d ethX //查询ethX网口注册性信息
ethtool –r ethX //重置ethX网口到自适应模式
ethtool –S ethX //查询ethX网口收发包统计
ethtool –s ethX [speed 10|100|1000]\ //设置网口速率10/100/1000M
[duplex half|full]\ //设置网口半/全双工
[autoneg on|off]\ //设置网口是否自协商
- Linux下如何获取网卡信息
- Linux下如何获取网卡信息
- Linux下如何获取网卡信息
- Linux下获取网卡信息
- Linux下获取多网卡信息
- Linux下获取所有可用网卡信息
- Linux下获取所有可用网卡信息
- Linux下获取所有可用网卡信息
- 如何在linux下配置网卡信息
- Linux 获取网卡信息
- Linux获取网卡信息
- linux获取网卡信息
- linux下libpcap 获取当前主机的网卡信息
- Linux下利用ioctl函数获取网卡信息
- linux下C编程_获取指定网卡IP信息
- Linux下利用ioctl函数获取网卡信息
- windows下获取网卡信息
- 在linux纯命令下如何去配置网卡信息
- 第一次写博客
- R文本挖掘之一安装R软件和包
- spark sql 表分区出现损坏
- 文件
- java回车事件触发
- Linux下如何获取网卡信息
- 一次查询一条数据花费6分钟的SQL优化到0.05s的经历
- php判断是否是整数的函数
- GRADLE多渠道打包
- Android异步消息处理机制完全解析
- makefile在同一目录下编译出多个可执行文件
- 整理的十个Linnux管理命令(2)
- 【工作笔记】从零开始学ExtJs6(四)—— 常用api小记
- Spring中使用log4j详细配置