最近在做一个小程序,需要用到在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地址的更多相关文章

  1. 获得Unix/Linux系统中的IP、MAC地址等信息

    获得Unix/Linux系统中的IP.MAC地址等信息 中高级  |  2010-07-13 16:03  |  分类:①C语言. Unix/Linux. 网络编程 ②手册  |  4,471 次阅读 ...

  2. linux系统下获取IP,MAC,子网掩码,网关

    获取IP和子网掩码 int getLocalInfo(char IP[],char Mask[]) { int fd; int interfaceNum = 0; struct ifreq buf[1 ...

  3. Linux系统下如何设置IP地址?

    Linux系统下如何设置IP地址?我们可以通过命令设定IP的方法,不过此方法的前提条件是用户需root权限.在linux系统的 /etc/sysconfig/network-script/ifcfg- ...

  4. Linux 获取本机IP、MAC地址用法大全

    getifaddrs()和struct ifaddrs的使用,获取本机IP ifaddrs结构体定义如下: struct ifaddrs { struct ifaddrs *ifa_next; /* ...

  5. Linux系统下DHCP服务安装部署和使用详解

    一.概述 DHCP :动态主机设置协议(英语:Dynamic Host Configuration Protocol,DHCP)是一个局域网的网络协议,使用UDP协议工作,主要有两个用途:用于内部网或 ...

  6. 【转载】Linux系统下命令行连接蓝牙设备 查看查找 蓝牙

    Linux系统下命令行连接蓝牙设备 2018年11月26日 10:47:27 Zz笑对一切 阅读数:741   1.打开系统蓝牙 sudo service bluetooth start 1 进入bl ...

  7. 在Linux系统下运行微信Web开发者工具

    微信Web开发者工具只有window版本和mac版本,如果想要在Linux系统下运行微信Web开发者工具,需要花费很大周折. 注:带 * 的步骤或文件为不确定是否管用的步骤或文件.本人系统为Linux ...

  8. linux系统下的权限知识梳理

    下面对linux系统下的有关权限操作命令进行了梳理总结,并配合简单实例进行说明.linux中除了常见的读(r).写(w).执行(x)权限以外,还有其他的一些特殊或隐藏权限,熟练掌握这些权限知识的使用, ...

  9. linux系统下修改文件夹目录权限

    linux系统下修改文件夹目录权限 文件夹权限问题 Linux.Fedora.Ubuntu修改文件.文件夹权限的方法差不多.很多人开始接触Linux时都很头痛Linux的文件权限问题.这里告诉大家如何 ...

随机推荐

  1. [原]C语言实现的快速排序,采用分治策略,递归实现

    #include<stdio.h> #define LEN 8 int a[LEN] = { 5, 2, 4, 7, 1, 3, 2, 6 }; int Partition(int a[] ...

  2. Java注释模板设置详解

    设置注释模板的入口: Window->Preference->Java->Code Style->Code Template 然后展开Comments节点就是所有需设置注释的元 ...

  3. Yslow-23条规则编辑

    1. 减少HTTP请求次数 合并图片.CSS.JS,改进首次访问用户等待时间.   2. 使用CDN 就近缓存==>智能路由==>负载均衡==>WSA全站动态加速   3. 避免空的 ...

  4. 从Qt4到Qt5的,主要的进化有三(对于QtWidget的精简和优化会很有限)

    从Qt4到Qt5的,主要的进化有三:1 语言的进化,原来是基于C++(qtwidget)和XML(.ui),现在添加了QML(QtQuick)+JS(v8)的架构.2 绘图系统的进化,原先基于QPai ...

  5. Linux远程桌面

    发现windows下有个VNC viewer.据说是跨平台的. sudo apt-cache search VNC | grep VNC了一下.发现有一个gvncviewer的包,然后apt-get ...

  6. android fragment传递参数_fragment之间传值的两种方法

    在Activity中加载Fragment的时候.有时候要使用多个Fragment切换.并传值到另外一个Fragment.也就是说两个Fragment之间进行参数的传递.查了很多资料.找到两种方法.一种 ...

  7. JDBC的使用——Statement

    JDBC是Java最基本的数据库操作途径,虽然现在有了更高端的Hibernate和JPA,但是其实它们的底层还是用的这些最基本的JDBC.而且,如果开发一个小型的应用程序,使用Hibernate不免有 ...

  8. Linux系统启动过程介绍

    Linux系统启动过程介绍 学习操作系统有必要了解一下系统的启动过程,这样在面对各种系统故障的时候能快速定位解决问题,下面以Centos来分析linux系统的启动过程. 1.BIOS自检:当开机的时候 ...

  9. netstat和telnet命令在Windows7中的用法(转载)

    在网络方面我们常常会用到如下命令: (1)ping命令:我们常常用来判断2台或2台以上的机器间是否网络连通. ping 192.168.1.88 -t 如果想看任何命令的参数是什么意思,我们只需要:命 ...

  10. Combinations 解答

    Question Given two integers n and k, return all possible combinations of k numbers out of 1 ... n. F ...