获取mac地址c语言,C语言获取服务器mac地址

获取mac地址c语⾔,C语⾔获取服务器mac地址
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, SIOCGIFHWA
广西中医学院学报
DDR, &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="/"
BUG_REPORT_URL="/"
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 /* 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]);
拳皇13卡}
int main(void)
{
unsigned char mac[6];
if (aix_get_mac_addr(mac) == -1){
perror("aix_getmac");
}
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. 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])

本文发布于:2024-09-21 22:08:21,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/612946.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:获取   地址   系统   信息   取出   结果   服务器   函数
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议