Linux系统

在Linux系统,可以通过系统调用函数ioctl很容易就获取到服务器的mac地址。#include

#include

#include

#include

#include

#include

int main()

{

int sock, if_count, i;

struct ifconf ifc;

struct ifreq ifr[10];

unsigned char mac[6];

memset(&ifc, 0, sizeof(struct ifconf));

sock = socket(AF_INET, SOCK_DGRAM, 0);

ifc.ifc_len = 10 * sizeof(struct ifreq);

ifc.ifc_buf = (char *)ifr;

//获取所有网卡信息

ioctl(sock, SIOCGIFCONF, (char *)&ifc);

if_count = ifc.ifc_len / (sizeof(struct ifreq));

for (i = 0; i < if_count; i++) {

if (ioctl(sock, SIOCGIFHWADDR, &ifr[i]) == 0) {

memcpy(mac, ifr[i].ifr_hwaddr.sa_data, 6);

printf("eth: %s, mac: %02x:%02x:%02x:%02x:%02x:%02x\n", ifr[i].ifr_name, mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);

}

}

return 0;

}

核心逻辑主要分两个部分,第一个部分是获取网卡,主要通过下面的函数完成:ioctl(sock, SIOCGIFCONF, (char *)&ifc);

它的信息保存在结构体struct ifconf中,有可能不止一个。获取到的信息保存在ifc_buf中。

第二个逻辑就是根据网卡的名字去获取mac地址,主要用下面的函数完成:ioctl(sock, SIOCGIFHWADDR, &ifr[i]);

通过上面简单的两步,就能获取到Linux服务器上所有的网卡对应的mac地址。

当前操作系统信息:[root@vm101108 src]# uname -a

Linux vm101108 3.10.0-1160.15.2.el7.x86_64 #1 SMP Wed Feb 3 15:06:38 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux

[root@vm101108 src]# cat /etc/os-release

NAME="CentOS Linux"

VERSION="7 (Core)"

ID="centos"

ID_LIKE="rhel fedora"

VERSION_ID="7"

PRETTY_NAME="CentOS Linux 7 (Core)"

ANSI_COLOR="0;31"

CPE_NAME="cpe:/o:centos:centos:7"

HOME_URL="https://www.centos.org/"

BUG_REPORT_URL="https://bugs.centos.org/"

CENTOS_MANTISBT_PROJECT="CentOS-7"

CENTOS_MANTISBT_PROJECT_VERSION="7"

REDHAT_SUPPORT_PRODUCT="centos"

REDHAT_SUPPORT_PRODUCT_VERSION="7"

上面的程序运行结果:[root@vm101108 src]# ./get_mac_addr

eth: lo, mac: 00:00:00:00:00:00

eth: em1, mac: b8:2a:72:dc:42:f2

eth: p5p2, mac: 90:e2:ba:89:46:bd

eth: docker0, mac: 02:42:1c:d3:f8:e8

查看本地网卡的mac地址:[root@vm101108 src]# ifconfig

docker0: flags=4163 mtu 1500

inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255

inet6 fe80::42:1cff:fed3:f8e8 prefixlen 64 scopeid 0x20

ether 02:42:1c:d3:f8:e8 txqueuelen 0 (Ethernet)

RX packets 0 bytes 0 (0.0 B)

RX errors 0 dropped 0 overruns 0 frame 0

TX packets 5 bytes 446 (446.0 B)

TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

em1: flags=4163 mtu 1500

inet 192.168.102.108 netmask 255.255.255.0 broadcast 192.168.102.255

inet6 fe80::9f88:a3a9:1748:56fc prefixlen 64 scopeid 0x20

ether b8:2a:72:dc:42:f2 txqueuelen 1000 (Ethernet)

RX packets 4420019 bytes 547543658 (522.1 MiB)

RX errors 0 dropped 52 overruns 0 frame 0

TX packets 6526650 bytes 6637157039 (6.1 GiB)

TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

device interrupt 55

lo: flags=73 mtu 65536

inet 127.0.0.1 netmask 255.0.0.0

inet6 ::1 prefixlen 128 scopeid 0x10

loop txqueuelen 1000 (Local Loopback)

RX packets 140886 bytes 12507428 (11.9 MiB)

RX errors 0 dropped 0 overruns 0 frame 0

TX packets 140886 bytes 12507428 (11.9 MiB)

TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

p5p2: flags=4163 mtu 1500

inet 192.168.101.108 netmask 255.255.255.0 broadcast 192.168.101.255

inet6 fe80::427c:e13c:50b6:d747 prefixlen 64 scopeid 0x20

ether 90:e2:ba:89:46:bd txqueuelen 1000 (Ethernet)

RX packets 57573979 bytes 50997944188 (47.4 GiB)

RX errors 0 dropped 41 overruns 0 frame 0

TX packets 1111442 bytes 673920374 (642.7 MiB)

TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

可见,取出来的mac地址是正确的。

AIX系统

AIX系统是power架构的,没有SIOCGIFHWADDR这个接口,因此,不能像Linux那样获取mac地址。

这里提供两种方法:

第一种方法#include

#include

#include

#include

#include

#include

#include

#include

#include /* for ifconf */

#include /* for sockaddr_in */

#include

static int aix_get_mac_addr(uint8_t mac[6])

{

struct ifconf ifc;

struct ifreq *ifr;

char buf[640] = "";

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

ifc.ifc_len = 640;

ifc.ifc_buf = buf;

if (sock < 0)

{

free(ifr);

return -1;

}

ioctl(sock, CSIOCGIFCONF, &ifc);

ifr = (struct ifreq *)buf;

struct sockaddr_dl *sdl = (struct sockaddr_dl *)&ifr->ifr_addr;

memcpy(mac, ((caddr_t)((sdl)->sdl_data + (sdl)->sdl_nlen)), 6);

close(sock);

free(ifr);

return 0;

}

void print_mac(uint8_t mac[6]){

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

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

}

int main(void)

{

unsigned char mac[6];

if (aix_get_mac_addr(mac) == -1){

perror("aix_getmac");

exit(2);

}

print_mac(mac);

}

这种方法的核心逻辑是通过ioctl(sock, SIOCGIFCONF, &ifc)取出网卡信息后,将其地址强转成struct sockaddr_dl类型。

当前操作系统:-bash-4.3# uname -a

AIX localhost 1 6 00C553DC4C00

-bash-4.3# oslevel

6.1.0.0

以上代码在AIX系统下运行结果:-bash-4.3# ./mac1

00:11:25:c5:97:cc

查看系统网卡:-bash-4.3# netstat -in

Name Mtu Network Address Ipkts Ierrs Opkts Oerrs Coll

en0 1500 link#2 0.11.25.c5.97.cc 127705533 0 1124424 3 0

en0 1500 192.168.21 192.168.21.216 127705533 0 1124424 3 0

lo0 16896 link#1 1787514 0 1709788 0 0

lo0 16896 127 127.0.0.1 1787514 0 1709788 0 0

lo0 16896 ::1%1 1787514 0 1709788 0 0

可见,取出来的mac地址是正确的。

第二种方法#include

#include

#include

#include

#include

#include

#include

#include

#include /* for ifconf */

#include /* for sockaddr_in */

#include

/*

get ethernet MAC address on AIX

*/

static int aix_get_mac_addr(uint8_t mac[6])

{

struct ifconf ifc;

struct ifreq *ifr;

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

ifc.ifc_len = sizeof(struct ifreq);

ifc.ifc_buf = (char *)ifr;

if (sock < 0)

{

free(ifr);

return -1;

}

ioctl(sock, SIOCGIFCONF, &ifc);

size_t ksize;

struct kinfo_ndd *ndd;

int count, i;

ksize = getkerninfo(KINFO_NDD, 0, 0, 0);

if (ksize == 0) {

errno = ENOSYS;

return -1;

}

ndd = (struct kinfo_ndd *)malloc(ksize);

if (ndd == NULL) {

errno = ENOMEM;

return -1;

}

if (getkerninfo(KINFO_NDD, ndd, &ksize, 0) == -1) {

errno = ENOSYS;

return -1;

}

count= ksize/sizeof(struct kinfo_ndd);

for (i=0;i

if ((ndd[i].ndd_type == NDD_ETHER ||

ndd[i].ndd_type == NDD_ISO88023) &&

ndd[i].ndd_addrlen == 6 &&

(strcmp(ndd[i].ndd_alias, ifr->ifr_name) == 0 ||

strcmp(ndd[i].ndd_name, ifr->ifr_name == 0))) {

memcpy(mac, ndd[i].ndd_addr, 6);

free(ndd);

return 0;

}

}

free(ndd);

errno = ENOENT;

return -1;

}

void print_mac(uint8_t mac[6]){

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

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

}

int main(void)

{

uint8_t mac[6];

int i, ret;

ret = aix_get_mac_addr(mac);

if (ret == -1) {

perror("aix_getmac");

exit(1);

}

print_mac(mac);

}

第二种方法是通过getkerninfo函数去获取相关硬件信息。

其运行结果和第一种方法得到的一样:-bash-4.3# ./mac2

00:11:25:c5:97:cc

Windows系统

//TODO

获取mac地址 c语言,C语言获取服务器mac地址相关推荐

  1. 华为如何显示我的电脑连接到服务器地址,怎么查电脑的服务器连接地址

    怎么查电脑的服务器连接地址 内容精选 换一换 本章节指导您使用MongoDB客户端和Robo 3T工具,通过公网连接GaussDB(for Mongo)集群实例.操作系统使用场景:弹性云服务器的操作系 ...

  2. 如何修改游戏服务器ip地址吗,怎么修改游戏服务器ip地址

    怎么修改游戏服务器ip地址 内容精选 换一换 云平台支持修改主网卡的私有IP地址,具体操作请参见本节内容.如需修改扩展网卡的私有IP地址,请删除网卡,并挂载新网卡.云服务器已关机.如果网卡绑定了虚拟I ...

  3. 虚拟手机服务器地址怎么设置,手机espace服务器设置地址

    手机espace服务器设置地址 内容精选 换一换 通过Web浏览器登录资源,会话页面载入失败,提示由于服务器长时间无响应,连接已断开,请检查您的网络并重试(Code:T_514).云堡垒机系统与资源服 ...

  4. 怎么查看网站数据库服务器ip地址,怎么查看网站数据库服务器ip地址吗

    怎么查看网站数据库服务器ip地址吗 内容精选 换一换 排查安全组规则.排查网络ACL.排查弹性云服务器内部网卡信息.排查不通端口.相同,请查看同一个VPC内的两台弹性云服务器无法互通或者出现丢包等现象 ...

  5. u8服务器ip地址在哪修改,u8服务器ip地址在哪修改

    u8服务器ip地址在哪修改 内容精选 换一换 IPv6的使用,可以有效弥补IPv4网络地址资源有限的问题.如果当前云服务器使用IPv4,那么启用IPv6后,云服务器可在双栈模式下运行,即云服务器可以拥 ...

  6. 宽带连接怎么修改服务器名称地址,宽带连接怎么修改服务器名称地址

    宽带连接怎么修改服务器名称地址 内容精选 换一换 在弹性云服务器上安装完成后输入公网IP,无法连接目的虚拟机,端口无法访问工具.源端网络未连通目的端.目的端安全组未开放8084端口.目的端网络ACL禁 ...

  7. 最快网络服务器ip地址,本地ISP真实DNS服务器IP地址;加快电脑速度三法

    屏蔽网络共享功能 要是我们的计算机并没有处于单位局域网网络中,那么已经被启用的网络共 享功能其实一点用处都没有,它的存在反而会拖累系统的启动速度;要想尽可能 地提高系统启动速度的话,我们完全可以将本地 ...

  8. 修改用友服务器ip地址,如何修改用友服务器ip地址

    如何修改用友服务器ip地址 内容精选 换一换 介绍使用同一VPC内弹性云服务器ECS上的Python客户端连接Memcached实例的方法.已成功申请Memcached实例,且状态为"运行中 ...

  9. 服务器ip地址变化 u8修改,u8服务器ip地址变更后如何设置

    u8服务器ip地址变更后如何设置 内容精选 换一换 本章节介绍如何使用管理控制台向导创建裸金属服务器.创建裸金属服务器时,您需要配置规格.镜像.存储.网络.安全组等必备信息.同时,向导也提供了丰富的扩 ...

最新文章

  1. 以太坊第五年,未来该往哪走?
  2. .net平台下C#socket通信(上)
  3. C语言如何产生随机数
  4. 如何构造天然满足某些约束的神经网络?
  5. 一块小饼干(Cookie)的故事-下篇
  6. uniapp连接php,thinkphp5 对接手机uni-app的unipush推送(个推)
  7. Spring Cloud Zuul –编写过滤器
  8. Oracle和MySQL的几点区别
  9. 《ETL原理及应用》学习笔记 ·001【ETL介绍】
  10. OpenCV精进之路(十三):角点检测
  11. DBCC PAGE、DBCC LOG、DBCC EXTENTINFO、DBCC IND、DBCC SHOW_STATISTICS、DBCC SHOWCONTIG、DBCC SQLPERF...
  12. vibe的matlab实现,Matlab調用VIBE算法
  13. MacOs提升效率必备软件
  14. Node连接MySql数据库写模糊查询接口
  15. DOS各版本下载地址
  16. 在IDEA中使用Maven详细教程
  17. HTML电子邮件格式的制作与发送
  18. 计蒜客——整数转换成罗马数字
  19. mysql取出的日期数据缺少时分秒_datetimepicker只显示日期,不显示时分秒
  20. 机器学习:向量空间中的投影

热门文章

  1. SQL Server中row_number函数用法介绍
  2. jQuery中Ajax事件beforesend及各参数含义
  3. linux网卡virbr0中inet,centos7下去掉virbr0网卡的方法.doc
  4. css3实现旋转的八卦图动画
  5. 第2章第21节:使用项目符号修饰段落中的文字内容 [PowerPoint精美幻灯片实战教程]
  6. Oracle 中 误删 emp,dept ,恢复 emp 和 dept表的sql脚本.
  7. 采用过渡、定位 制作 小米 logo制作案例
  8. PTA 在霍格沃茨找零钱 (20分)
  9. NeurIPS 2019年十篇机器学习领域的论文解读:来自谷歌、Facebook、普林斯顿大学、斯坦福大学最新研究成果
  10. 当产品经理遇到了研发总监,搞不清楚了性别!