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

linux c++获取mac地址,C++获得本机所有网卡的IP和MAC地址信息的实现方法 一台机器上可能不只有一个网卡,但每一个网卡只有一个MAC地址,而每一个网卡可能配置有多个IP地址;如平常的笔记本电脑中,就会有无线网卡和有线网卡(网线接口)两种;因此,如果要获得本机所有网卡的IP和MAC地址信息,则必须顺序获得每个网卡,再依次获取其信息等;在windows sdk中,用IP_ADAPTER_INFO结构体存储网卡信息,包括网卡名、网卡描述、网卡MAC地址、网卡IP等,该结构体的主... 阅读详情
/*
mode time:20120727
LINUX下获取IP地址和MAC地址.程序相关结构体在程序后面。
 打印网卡的ip地址 子网掩码  广播地址 mac地址
环境:
	[root@bogon temp]# uname -a
	Linux bogon 2.6.31.5-127.fc12.i686.PAE #1 SMP Sat Nov 7 21:25:57 EST 2009 i686 i686 i386 GNU/Linux
*/
#include <stdio.h> 
#include <sys/types.h> 
#include <sys/param.h> 
#include <sys/ioctl.h> 
#include <sys/socket.h> 
#include <net/if.h> 
#include <netinet/in.h> 
#include <net/if_arp.h> 
#ifdef SOLARIS 
#include <sys/sockio.h> 
#endif 
#define MAXINTERFACES 16 /* 最大接口数 */

int  main(int argc, char **argv)
{ 
	register int fd, intrface, retn = 0; 
	struct ifreq buf[MAXINTERFACES]; /* ifreq结构数组 */
	struct arpreq arp; 
	struct ifconf ifc; 
	if ((fd = socket (AF_INET, SOCK_DGRAM, 0)) >= 0) 
	{ 
		ifc.ifc_len = sizeof buf; 
		ifc.ifc_buf = (caddr_t) buf; 
		if (!ioctl (fd, SIOCGIFCONF, (char *) &ifc)) 
		{ 
			//获取接口数量信息
			intrface = ifc.ifc_len / sizeof (struct ifreq); 
			printf("interface num is intrface=%d\n",intrface); 
			puts("");
			//根据借口信息循环获取设备IP和MAC地址
			while ( (intrface--) > 0) 
			{ 
				//获取设备名称
				printf ("net device %s\n", buf[intrface].ifr_name); 

				//判断网卡类型 
				if (!(ioctl (fd, SIOCGIFFLAGS, (char *) &buf[intrface]))) 
				{ 
					if (buf[intrface].ifr_flags & IFF_PROMISC) 
					{ 
						puts ("the interface is PROMISC"); 
						retn++; 
					} 
				} 
				else 
				{ 
					char str[256]; 
					sprintf (str, "cpm: ioctl device %s", buf[intrface].ifr_name); 
					perror (str); 
				} 
				//判断网卡状态 
				if (buf[intrface].ifr_flags & IFF_UP) 
				{ 
					puts("the interface status is UP"); 
				} 
				else 
				{ 
					puts("the interface status is DOWN"); 
				} 
				//获取当前网卡的IP地址 
				if (!(ioctl (fd, SIOCGIFADDR, (char *) &buf[intrface]))) 
				{ 
					printf("IP address is:"); 
					puts((char *)inet_ntoa(((struct sockaddr_in*)(&buf[intrface].ifr_addr))->sin_addr)); 
					//printf("\n%d\n"buf[intrface].ifr_addr))->sin_addr.s_addr); 
					//puts (buf[intrface].ifr_addr.sa_data); 
				} 
				else 
				{ 
					char str[256]; 
					sprintf (str, "cpm: ioctl device %s", buf[intrface].ifr_name); 
					perror (str); 
				} 
				/* this section can't get Hardware Address,I don't know whether the reason is module driver*/ 
		#ifdef SOLARIS 
				//获取MAC地址
				arp.arp_pa.sa_family = AF_INET; 
				arp.arp_ha.sa_family = AF_INET; 
				((struct sockaddr_in*)&arp.arp_pa)->sin_addr.s_addr=((struct sockaddr_in*)(&buf[intrface].ifr_addr))->sin_addr.s_addr; 
				if (!(ioctl (fd, SIOCGARP, (char *) &arp))) 
				{ 
					printf("HW address is:"); 
					//以十六进制显示MAC地址
					printf("%02x:%02x:%02x:%02x:%02x:%02x\n", 
							(unsigned char)arp.arp_ha.sa_data[0], 
							(unsigned char)arp.arp_ha.sa_data[1], 
							(unsigned char)arp.arp_ha.sa_data[2], 
							(unsigned char)arp.arp_ha.sa_data[3], 
							(unsigned char)arp.arp_ha.sa_data[4], 
							(unsigned char)arp.arp_ha.sa_data[5]); 
					puts(""); 
					puts(""); 
				} 

#else 
#if 0 
				/*Get HW ADDRESS of the net card */ 
				if (!(ioctl (fd, SIOCGENADDR, (char *) &buf[intrface]))) 
				{ 
					printf("HW address is:"); 
					printf("%02x:%02x:%02x:%02x:%02x:%02x\n", 
							(unsigned char)buf[intrface].ifr_enaddr[0], 
							(unsigned char)buf[intrface].ifr_enaddr[1], 
							(unsigned char)buf[intrface].ifr_enaddr[2], 
							(unsigned char)buf[intrface].ifr_enaddr[3], 
							(unsigned char)buf[intrface].ifr_enaddr[4], 
							(unsigned char)buf[intrface].ifr_enaddr[5]); 
					puts(""); 
				} 
#endif 
				if (!(ioctl (fd, SIOCGIFHWADDR, (char *) &buf[intrface]))) 
				{ 
					printf("HW address is:"); 
					printf("%02x:%02x:%02x:%02x:%02x:%02x\n", 
							(unsigned char)buf[intrface].ifr_hwaddr.sa_data[0], 
							(unsigned char)buf[intrface].ifr_hwaddr.sa_data[1], 
							(unsigned char)buf[intrface].ifr_hwaddr.sa_data[2], 
							(unsigned char)buf[intrface].ifr_hwaddr.sa_data[3], 
							(unsigned char)buf[intrface].ifr_hwaddr.sa_data[4], 
							(unsigned char)buf[intrface].ifr_hwaddr.sa_data[5]); 
				} 
#endif 
				else 
				{ 
					char str[256]; 
					sprintf (str, "cpm: ioctl device %s", buf[intrface].ifr_name); 
					perror (str); 
				} 
				//子网掩码
				 if (!(ioctl(fd, SIOCGIFNETMASK, (char *) &buf[intrface])))
        {
	            printf("MASK:%s",
                    (char*)inet_ntoa(((struct sockaddr_in*) (&buf[intrface].ifr_addr))->sin_addr));
              puts(""); 
        }
       else
        {
           char str[256];
            sprintf(str, "SIOCGIFADDR ioctl %s", buf[intrface].ifr_name);
            perror(str);
       }
       //广播地址
       if (! (ioctl(fd, SIOCGIFBRDADDR, (char *) &buf[intrface])))
				printf("Broadcast Address:%s\n",
					(char*)inet_ntoa(((struct sockaddr_in*) (&buf[intrface].ifr_addr))->sin_addr));

			puts(""); 
			puts(""); 
			} //while
		} else 
			perror ("cpm: ioctl"); 
	} else 
		perror ("cpm: socket"); 
	close (fd); 
	return retn; 
}
/*
#include <sys/ioctl.h>
int ioctl(int fd, int request, … * void *arg *);
返回:成功返回0,失败返回-1

char *inet_ntoa (struct in_addr);
  返回点分十进制的字符串在静态内存中的指针。
  所在头文件:<arpa/inet.h> 函数功能:将网络地址转换成“.”点隔的字符串格式。
  所需库: winsock.h

#include<linux.h>
struct ifconf 
{
	int	ifc_len;			/* size of buffer	*
	union 
	{
		char __user *ifcu_buf;
		struct ifreq __user *ifcu_req;
	} ifc_ifcu;
};

struct ifreq 
{
#define IFHWADDRLEN	6
	union
	{
		char	ifrn_name[IFNAMSIZ];		* if name, e.g. "en0" *
	} ifr_ifrn;
	
	union {
		struct	sockaddr ifru_addr;
		struct	sockaddr ifru_dstaddr;
		struct	sockaddr ifru_broadaddr;
		struct	sockaddr ifru_netmask;
		struct  sockaddr ifru_hwaddr;
		short	ifru_flags;
		int	ifru_ivalue;
		int	ifru_mtu;
		struct  ifmap ifru_map;
		char	ifru_slave[IFNAMSIZ];	/* Just fits the size *
		char	ifru_newname[IFNAMSIZ];
		void __user *	ifru_data;
		struct	if_settings ifru_settings;
	} ifr_ifru;
};

#define ifr_name	ifr_ifrn.ifrn_name	/* interface name 	*
#define ifr_hwaddr	ifr_ifru.ifru_hwaddr	/* MAC address 		*
#define	ifr_addr	ifr_ifru.ifru_addr	/* address		*
#define	ifr_dstaddr	ifr_ifru.ifru_dstaddr	/* other end of p-p lnk	*
#define	ifr_broadaddr	ifr_ifru.ifru_broadaddr	/* broadcast address	*
#define	ifr_netmask	ifr_ifru.ifru_netmask	/* interface net mask	*
#define	ifr_flags	ifr_ifru.ifru_flags	/* flags		*
#define	ifr_metric	ifr_ifru.ifru_ivalue	/* metric		*
#define	ifr_mtu		ifr_ifru.ifru_mtu	/* mtu			*
#define ifr_map		ifr_ifru.ifru_map	/* device map		
#define ifr_slave	ifr_ifru.ifru_slave	/* slave device		*
#define	ifr_data	ifr_ifru.ifru_data	/* for use by interface	*
#define ifr_ifindex	ifr_ifru.ifru_ivalue	/* interface index	
#define ifr_bandwidth	ifr_ifru.ifru_ivalue    /* link bandwidth	*
#define ifr_qlen	ifr_ifru.ifru_ivalue	/* Queue length 	*
#define ifr_newname	ifr_ifru.ifru_newname	/* New name		*
#define ifr_settings	ifr_ifru.ifru_settings	/* Device/proto settings*

*/
[root@bogon temp]# gcc -g -o get_ip get_ip.c
[root@bogon temp]# ./get_ip
interface num is intrface=2

net device eth1
the interface status is UP
IP address is:192.168.94.125
HW address is:00:0c:29:26:e4:f2
MASK:255.255.255.0
Broadcast Address:192.168.94.255


net device lo
the interface status is UP
IP address is:127.0.0.1
HW address is:00:00:00:00:00:00
MASK:255.0.0.0
Broadcast Address:0.0.0.0



Linux下C++ STL获取Mac地址 注意,这个代码假设你的网络接口是eth0。如果你的网络接口不是eth0,你需要相应地更改文件路径。或者直接用QtCreator创建C++项目。 阅读详情

相关推荐

ANSYS ICEM CFD 2023R2 结构化网格实战:翼型绕流 10 步生成高质量六面体网格

在计算流体力学(CFD)分析中,网格质量直接决定了仿真结果的精度和收敛性。对于翼型绕流这类典型的外部流动问题,结构化网格因其规则的节点排列和优异的边界层捕捉能力,成为高精度模拟的首选方案。通过在后缘处添加局部H型拓扑,并将过渡区增长率降至1.1,最终使网格质量指标提升40%,计算收敛速度提高2倍。这印证了结构化网格在复杂流动模拟中的不可替代性——虽然初期投入时间较多,但能显著提升计算精度和稳定性。在开始网格划分前,合理的几何准备是确保后续流程顺利的关键。对于翼型绕流,O型网格拓扑能提供最佳的边界层适应性。

weixin_30731305的博客 362

linux C获取Mac地址

此处是通过设置ifr_name,然后通过ioctl获取mac地址,ifr_name一般是eth0或者ens33。无论是否联网都可以获取到,但是当程序运行在其他客户端,不可能要求用户那里的网卡名称也是eth0,所以此方法仅能用作本地测试,或者用命令行方式传入网卡名称,然后获取指定网卡名称的mac地址。可是ifconfig命令不是更好用更方便吗?ioctl调用SIOCGIFCONF只能获取到活动网卡,如果把ens33或者eth0的网络连接断开,就获取不到了。1.基础用法,获取eth0的mac地址。.......

youyudexiaowangzi的专栏 3171

毫米波雷达SLAM实战:如何在无GPS的地下隧道实现精准三维建图(附Python代码)

本文深入探讨了在无GPS信号的地下隧道等拒止环境中,如何利用毫米波雷达SLAM技术实现精准三维建图。文章系统分析了毫米波雷达点云数据稀疏、噪声多的挑战,并提供了从环境配置、核心算法(如特征提取、ICP配准、回环检测)到全局优化的完整实战解决方案,附有可运行的Python代码,帮助开发者构建鲁棒的自主导航与建图系统。

t8u9v0w1x的博客 240

Android wpa_supplcant 启动之--网络接口初始化

wpa_supplicant结构体与网络接口在手机adb中运行 netcfg或者ifconfig可以看到相关的网络接口的ip,掩码,mac地址等信息Wpa_supplicant为每个网络接口都分配了一个struct wpa_supplicant, 该结构体存储了一些必要信息例如 struct dl_list bss(扫描结果); struct wpa_config *conf(配置文件)等等。 每...

蓝精灵的专栏 1286

unity 在透明物体上投射阴影

unity版本:2019.4.16 创建一个shader,代码如下: Shader "ChuckLee/ARShadow" { Properties { _ShadowColor("Shadow Color", Color) = (0.1, 0.1, 0.1, 0.53) } SubShader { Tags{ "RenderType" = "Transparent" "Queue" = "Geometry+1" } Blend SrcAlpha OneMinusSrcAlph

Abel02的博客 2953

浏览器主页被2345劫持简单处理方法

本人比较常用的浏览器是IE和Chrome IE: 将网址修改为https://www.baidu.com 应用-确定-重新打开IE浏览器 或者win+r运行regedit打开注册表找到这个值   HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main下  和HKEY_CURRENT_USER\Software\Policies\Microsoft\Internet Explorer\Main这个下面的StartPage ...

A soul tortured by desire 2万+

linux原始套接字(1)-arp请求与接收

以太网的arp数据包结构: arp结构op操作参数:1为请求,2为应答。 常用的数据结构如下: 1.物理地址结构位于netpacket/packet.h struct sockaddr_ll {     unsigned short int sll_family;     unsigned short int sll_protocol;     int sl

weijinqian0的博客 3305

思博伦仪表打流测试使用总结

下图红框中的checkbox为选中状态时,表示该流会携带测试仪做一些分析,包括时延和乱序等信息时需要的一些字节,当改选项选中时,如配置IPv4的TCP流,最小字节长度必须为78字节;如果需要64字节的TCP流,改选项必须不选中;

陌上花开缓缓归以的博客 1465

Linux系统利用C语言获取网口信息(IP地址,MAC地址,状态,带宽speed等)

目录 设计思路 ioctl操作参数 获取网口的遍历结构 获取对应的参数信息 源代码 ifinfo.c ifinfo.h test.c 测试结果 设计思路 首先给需要查询的信息定义个结构(当然,这里可以扩展) /** * struct ifinfo - 网卡信息结构 * * if_idx 网口在系统中的索引, 这里需要注意的是,派生的网口 em1:1 与 em1 的索引相同 * if_name 网口名,例如:eth0 * if_flag.

RToax 9750

基于扩散模型的图像去噪与修复:原理、实现与性能分析【附核心代码】

扩散模型(Diffusion Models)在图像修复、去噪、风格化、超分辨率等领域的应用,展示了其强大的生成能力和灵活性。通过模拟图像逐步加噪声再去噪的过程,扩散模型不仅能够恢复图像的细节,还能生成高质量的图像。本文详细探讨了扩散模型在图像修复和增强中的应用,并通过具体代码示例展示了如何使用扩散模型进行去噪、风格化、图像超分辨率等任务。扩散模型在图像修复中通过逐步去噪修复损坏的区域,在图像去噪中则能够去除图像中的噪声并保留细节;在图像风格化中,扩散模型通过结合目标风格和内容生成富有艺术性的图像;

一键难忘的博客 2929

机器学习之多种算法优缺点总结及优化方法

一、无监督算法: 1、聚类算法:Kmeans 2、关联规则算法:Apriori 二、有监督算法 1、分类算法 决策树(Decision Tree) 支持向量机(SVM) K近邻(kNN,k-NearestNeighbor) 朴素贝叶斯 逻辑回归 2、回归算法 线性回归 多项式回归 3、集成算法 a、bagging(Bootstrapped Aggregation) 随机森林 ...

平原的博客 7081

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

/*mode time:20120727LINUX下获取IP地址和MAC地址.程序相关结构体在程序后面。打印网卡的ip地址 子网掩码 广播地址 mac地址环境:[root@bogon temp]# uname -aLinux bogon 2.6.31.5-127.fc12.i686.PAE #1 SMP Sat Nov 7 21:25:57 EST 2009 i686 i686 i386 GNU...

weixin_42523846的博客 569

Coverity本地增量C/C++代码检查(Linux)操作简介

Coverity 是一款精确的综合静态分析与应用安全测试 (SAST) 平台,它可以在编写代码时发现关键的缺陷和安全缺陷,防止它们变成安全漏洞、故障或维护缺陷。

1483

linux 获取网卡mac地址命令行,LINUX下获取网卡IP地址和MAC地址,子网掩码程序参考...

#ifdef SOLARIS#include #endif#define MAXINTERFACES 16 /* 最大接口数 */int main(int argc, char **argv){register int fd, intrface, retn = 0;struct ifreq buf[MAXINTERFACES]; /* ifreq结构数组 */struct arpreq arp;...

weixin_27134143的博客 485

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

linux c 获取本地IP,MAC 子网掩码等信息

#---------------------------------------------需要的了解一下-------------------------------------------------------------- 阿里云产品推广 最高¥2000云产品通用代金券 通过链接购买产品即可获得最高2000元的通用产品代金券。 不管你是学生、希望一个简单云主机试水 你是站长、博主需要购...

邓全杰 7974

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

linux临时配置mac地址,Linux获取网卡型号、mac地址、修改IP地址的几种方法

1.获取所有有(无)网卡型号方法一、ifconfig用法:ifconfig | grep | cut -d ':' -f 1ubunturoot@ubuntu:~# ifconfig | grep enp| cut -d ':' -f 1enp2s0enp3s0centos[root@centos ~]# ifconfig | grep ens| cut -d ':' -f 1ens192注意:...

weixin_39654436的博客 1822

Linux c语言获取本机 ip、子网掩码

Linux c语言获取本机 ip、子网掩码,以及介绍了Linux 下获取网络接口信息的一些方案

小立仔 7673

Python 获取本机所有网卡 IP/MAC 地址

本文介绍了三种Python跨平台获取网卡信息的方案,支持Windows/Linux/MacOS系统,适用于多网卡场景。核心方案对比显示,netifaces第三方库功能最完整,能获取IP、MAC、网卡名和子网掩码等信息,推荐优先使用;标准库方案无需依赖但功能有限;系统命令调用方案适合无第三方库环境。文中提供了每种方案的完整代码示例,netifaces方案可精确输出各网卡详细信息,标准库方案则适合简单场景快速获取默认IP和MAC地址。这些方法可用于网络编程、运维自动化等场景,实现设备识别、网络调试等功能。

用一行行优雅代码重构现实的造梦者,坚信简洁即正义的美学践行者。 1491

网络ioctl实践3:设置网卡的mac、ip、子网掩码、广播地址

网络ioctl实践3:设置网卡的mac、ip、子网掩码、广播地址

2436

Linux下获取网卡IP,Netmask,Mac地址(gcc编译通过)

Linux下获取网卡IP,Netmask,Mac地址(gcc编译通过) #include #include #include #include #include int GetIP(const char *ifname, unsigned char *ip) { int sock, ret; struct ifreq ifr; sock = socket

1111

mac地址、ip地址、子网掩码、端口

TCP/IP协议采用端口标识通信的进程用于区分一个系统里面的多个进程特点1.对于一个端口号,在·不同的系统中对应着不同的进程2.对于同一个系统,一个端口只能被一个进程拥有3. 一个进程拥有一个端口后,传输层送到该端口的数据,全被该进程接收,同样的,进程送交的传输层的数据也通过端口被送出.

weixin_52243202的博客 1680

IP地址、子网掩码、网关(Linux查看和配置)

IP地址、子网掩码、网关(LINUX查看及配置)

weixin_47505548的博客 1万+

Linux查看网卡ip地址,查看网卡IP地址

~~~ifconfig~~~![](http://www.iumi.me/linux/51A831EE9391BBF653FB10333F1D1FDE.png)第一行: Link encap: 网络连接类型, HWaddr : 对应网卡的mac地址,这是出场时唯一的地址。(可以通过ifconfig为网卡设置伪mac地址)第二行:inet addr :IPV4版本的IP地址; Bcast: 广播地址...

weixin_39676034的博客 4243

linux C 获取ip mac 广播地址,以及网关

获取IP、掩码、MAC 获取IP、掩码、MAC和广播地址是比较容易的,只需要调用对应的IOCTL即可。只是大家对Linux下的IOCTL可能不太熟悉。却看示例代码:  const char* szDevName  =  ”eth0“   (网卡名称) 0001 void DispNetInfo(const char* szDevName) 0002 { 0003     int s

yikesong321的专栏 3794

linux查看地址_linux怎么查看ip地址和网卡MAC地址?这个独特的命令你用过吗?

请关注本头条号,每天坚持更新原创干货技术文章。如需学习视频,请在微信搜索公众号“智传网优”直接开始自助视频学习1. 前言不同的Linux发行版显示网卡配置信息时有不同的格式,如果我们通过shell脚本读取这些网卡信息时,可能需要较长时间编写这些脚本以满足需求.比如使用以下命令获取ip地址ifconfig | grep 'inet addr:'| grep -v '127.0.0.1' | cut ...

weixin_39958138的博客 868

[面试之路]如何在linux环境下查看自己主机的ip地址

使用命令 ifconfig 在命令行下输入命令 得到如下结果: etho 表示网卡的代号(这里只有一块网卡,所以只有一个eth0,如果有若干网卡,则会有eth1,eth2等) Link encap:表示网络接入类型,这里是Ethernet 表示以太网! HWaddr: 硬件地址,也就MAC地址,图片里为FA:16:3E:9C:85:EB inet addr:表示IP地址 Bcast:表示Bro...

一个小菜鸟的博客 2万+
上一篇: Shell中引号、单引号、反引号简介
下一篇: vim ctags使用方法
夏天__
博客等级 码龄15年 42粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值