Linux系统下用C语言获取MAC地址
最近在做一个小程序,需要用到在linux系统里编写C程序从而获取MAC地址,从网上搜了一遍,想总结一下。如果你就只需要单个功能的程序,可以采用方法一,见代码1,一般最好能够封装起来,写成获取MAC地址的函数再调用,可以采用方法二,见代码2。
代码1:
#include <stdio.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <net/if.h>
#include <string.h> int main(int argc, char *argv[])
{ struct ifreq ifreq;
int sock; if(argc!=)
{
printf("Usage : ethname\n");
return ;
}
if((sock=socket(AF_INET,SOCK_STREAM,))<)
{
perror("socket");
return ;
}
strcpy(ifreq.ifr_name,argv[]);
if(ioctl(sock,SIOCGIFHWADDR,&ifreq)<)
{
perror("ioctl");
return ;
}
printf("%02x:%02x:%02x:%02x:%02x:%02x\n",
(unsigned char)ifreq.ifr_hwaddr.sa_data[],
(unsigned char)ifreq.ifr_hwaddr.sa_data[],
(unsigned char)ifreq.ifr_hwaddr.sa_data[],
(unsigned char)ifreq.ifr_hwaddr.sa_data[],
(unsigned char)ifreq.ifr_hwaddr.sa_data[],
(unsigned char)ifreq.ifr_hwaddr.sa_data[]);
return ;
}
将代码写入一个C文件,名称随便取,姑且存为MAC_addr.c。
在linux下运行:gcc -o MAC_addr MAC_addr.c
下一条指令要十分注意,这个函数是带参数才能执行的,可以用以下指令:
./MAC_addr etho 即可获得MAC地址。
想用封装的形式,写成一个求MAC地址的函数,然后再调用此函数,可以用方法二,见代码2。
代码2:
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <net/if.h> //for struct ifreq int get_mac(char * mac, int len_limit) //返回值是实际写入char * mac的字符个数(不包括'\0')
{
struct ifreq ifreq;
int sock; if ((sock = socket (AF_INET, SOCK_STREAM, )) < )
{
perror ("socket");
return -;
}
strcpy (ifreq.ifr_name, "eth0"); //Currently, only get eth0 if (ioctl (sock, SIOCGIFHWADDR, &ifreq) < )
{
perror ("ioctl");
return -;
} return snprintf (mac, len_limit, "%X:%X:%X:%X:%X:%X", (unsigned char) ifreq.ifr_hwaddr.sa_data[], (unsigned char) ifreq.ifr_hwaddr.sa_data[], (unsigned char) ifreq.ifr_hwaddr.sa_data[], (unsigned char) ifreq.ifr_hwaddr.sa_data[], (unsigned char) ifreq.ifr_hwaddr.sa_data[], (unsigned char) ifreq.ifr_hwaddr.sa_data[]);
} int main()
{
char szMac[];
int nRtn = get_mac(szMac, sizeof(szMac));
if(nRtn > )
{
fprintf(stderr, "MAC ADDR: %s\n", szMac);
}
return ;
}
将代码写入一个C文件,姑且存为MAC_addr.c。
在linux下运行:gcc -o MAC_addr MAC_addr.c
./MAC_addr 即可获得MAC地址。
亲测以上方法都是通过的,欢迎讨论是否还有更好的方法!
Linux系统下用C语言获取MAC地址的更多相关文章
- 获得Unix/Linux系统中的IP、MAC地址等信息
获得Unix/Linux系统中的IP.MAC地址等信息 中高级 | 2010-07-13 16:03 | 分类:①C语言. Unix/Linux. 网络编程 ②手册 | 4,471 次阅读 ...
- linux系统下获取IP,MAC,子网掩码,网关
获取IP和子网掩码 int getLocalInfo(char IP[],char Mask[]) { int fd; int interfaceNum = 0; struct ifreq buf[1 ...
- Linux系统下如何设置IP地址?
Linux系统下如何设置IP地址?我们可以通过命令设定IP的方法,不过此方法的前提条件是用户需root权限.在linux系统的 /etc/sysconfig/network-script/ifcfg- ...
- Linux 获取本机IP、MAC地址用法大全
getifaddrs()和struct ifaddrs的使用,获取本机IP ifaddrs结构体定义如下: struct ifaddrs { struct ifaddrs *ifa_next; /* ...
- Linux系统下DHCP服务安装部署和使用详解
一.概述 DHCP :动态主机设置协议(英语:Dynamic Host Configuration Protocol,DHCP)是一个局域网的网络协议,使用UDP协议工作,主要有两个用途:用于内部网或 ...
- 【转载】Linux系统下命令行连接蓝牙设备 查看查找 蓝牙
Linux系统下命令行连接蓝牙设备 2018年11月26日 10:47:27 Zz笑对一切 阅读数:741 1.打开系统蓝牙 sudo service bluetooth start 1 进入bl ...
- 在Linux系统下运行微信Web开发者工具
微信Web开发者工具只有window版本和mac版本,如果想要在Linux系统下运行微信Web开发者工具,需要花费很大周折. 注:带 * 的步骤或文件为不确定是否管用的步骤或文件.本人系统为Linux ...
- linux系统下的权限知识梳理
下面对linux系统下的有关权限操作命令进行了梳理总结,并配合简单实例进行说明.linux中除了常见的读(r).写(w).执行(x)权限以外,还有其他的一些特殊或隐藏权限,熟练掌握这些权限知识的使用, ...
- linux系统下修改文件夹目录权限
linux系统下修改文件夹目录权限 文件夹权限问题 Linux.Fedora.Ubuntu修改文件.文件夹权限的方法差不多.很多人开始接触Linux时都很头痛Linux的文件权限问题.这里告诉大家如何 ...
随机推荐
- webService设置超时时间
在客户端配置文件中设置: <bindings> <basicHttpBinding> <binding name="UrlCrawler ...
- 学习Emacs
1.http://ergoemacs.org/emacs/emacs.html 2.Debian7安装emacs24 http://my.oschina.net/xuzhouyu/blog/14954 ...
- 原创:应用串行NOR闪存提升内存处理能力
在嵌入式系统中,NOR闪存一直以来仍然是较受青睐的非易失性内存,NOR器件的低延时特性可以接受代码执行和数据存储在一个单一的产品.虽然NAND记忆体已成为许多高密度应用的首选解决方案,但NOR仍然是低 ...
- Keil C51 中指针的使用
指针是C语言中比较难的一个内容,Keil C51在指针方面有和标准C不一样的地方,今天看了一些资料学习了一下Keil C51 中指针的使用. keil51的指针,包含两种指针:普通指针,兼容标准C:内 ...
- Linux命令之xargs的分析及隐患
写一个main.c: #include <stdio.h> int main(){ printf("foo"); printf("bar"); re ...
- MSSQL WITH (NOLOCK) 脏读
缺点: 1.会产生脏读 2.只适用与select查询语句 优点: 1.有些文件说,加了WITH (NOLOCK)的SQL查询效率可以增加33%. 2.可以用于inner join 语句 脏读: 一个用 ...
- UESTC_Ferris Wheel String 2015 UESTC Training for Search Algorithm & String<Problem L>
L - Ferris Wheel String Time Limit: 3000/1000MS (Java/Others) Memory Limit: 43000/43000KB (Java/ ...
- UVA 10152-ShellSort(映射+栈)
题意: 给出一堆乌龟名字,乌龟能从本身位置爬到顶端. 要求求出从原本的顺序到目标顺序的最小操作.输出每次操作移到顶端的乌龟的名字. 解析:名字用映射对应编号,把目标状态的乌龟从上到下的编号按1到N编好 ...
- 解决mongodb连接失败问题
错误提示: MongoDB shell version: 2.4.9 connecting to: test Mon Mar 3 23:45:09.491 Error: couldn't conne ...
- linux下vi命令大全(转载)
进入vi的命令 vi filename :打开或新建文件,并将光标置于第一行首 vi +n filename :打开文件,并将光标置于第n行首 vi + filename :打开文件,并将光标置于最后 ...