Linux下如何获取网卡信息

转载 2013年12月04日 14:11:07
有时候,写程序的时候需要获取计算机的网络信息,比如IP地址、电脑名称、DNS等信息。IP地址和电脑名称是比较容易获取到的,而要想获取地址掩码、DNS、网关等信息就有些麻烦了。
在Windows下我们一般都是通过从注册表读取这些信息。在Linux怎么做呢?其实,Linux下更加容易一些。因为我们可以拿现成的程序看它的源代码。通过阅读其源代码找到解决该问题的方法。那么,看哪个程序的源代码呢?如果你使用过Linux,并且比较熟悉的话就肯定知道一个命令ifconfig。这个命令和Windows下的ipconfig差不多,都可以输出网卡的信息,其中就包含DNS、掩码等信息。所以,我们可以通过看它的源代码来找到解决该问题的方法。

获取系统中的网卡数量

并没有那个系统调用提供网卡数量的获取。但是,我们可以通过强大的proc文件系统获取网卡数量的信息。实际上,ifconfig也是这样做的,请看示例代码如下:

#include <stdio.h>
#include <string.h>
#include <errno.h>
				 
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.360doc.com/content/12/0222/10/1317564_188554876.shtml

相关文章推荐

Linux下如何获取网卡信息

有时候,写程序的时候需要获取计算机的网络信息,比如IP地址、电脑名称、DNS等信息。IP地址和电脑名称是比较容易获取到的,而要想获取地址掩码、DNS、网关等信息就有些麻烦了。 在Windows下我们...

Linux下获取所有可用网卡信息

/*============================================================================ Name : Exerci...

linux下的shell命令的编写,以及java如何调用linux的shell命令(java如何获取linux上的网卡的ip信息)

程序员都很懒,你懂的! 最近在开发中,需要用到服务器的ip和mac信息。但是服务器是架设在linux系统上的,对于多网口,在获取ip时就产生了很大的问题。下面是在windows系统上,java获...

linux下的shell命令的编写,以及java如何调用linux的shell命令(java如何获取linux上的网卡的ip信息)

最近在开发中,需要用到服务器的ip和mac信息。但是服务器是架设在linux系统上的,对于多网口,在获取ip时就产生了很大的问题。下面是在windows系统上,java获取本地ip的方法。 在Linu...

Linux下网卡驱动和版本信息

本文档描述如何查看Linux下网卡驱动和版本信息!!

linux下查看网卡信息的命令

linux下查看网卡信息的命令

linux下获取网卡IP地址、MAC地址、RX_BYTES、TX_BYTES

第一次写博客,希望将自己学到的的东西记录下来,同时也分享给大家。 如果你看到我写的文章,若有不到之处,还望多多指教。 我们进入正题吧:在linux下面获取网卡IP地址、MAC地址、RX_BYTES...
  • glu616
  • glu616
  • 2013年06月11日 17:47
  • 3186

获取linux下CPU、网卡、硬盘ID

获取linux下CPU、网卡、硬盘ID#include #include #include #include #include #include #include #include #...

LINUX下获取网卡IP地址和MAC地址,子网掩码程序参考

/* mode time:20120727 LINUX下获取IP地址和MAC地址.程序相关结构体在程序后面。 打印网卡的ip地址 子网掩码 广播地址 mac地址 环境: [root@bogon ...

【开发总结】Linux下获取物理网卡带宽最大值

背景: 现阶段手头的一个自研的流式计算平台在完善监控体系,对机器资源负载、机器上任务资源消耗进行统计和上报,这里对Linux下获取网卡上限的方法进行梳理。 说明:这里的网卡最大带宽指的是物理...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Linux下如何获取网卡信息
举报原因:
原因补充:

(最多只允许输入30个字)