原文:http://blog.chinaunix.net/uid-25885064-id-3125167.html

#include <sys/ioctl.h>
#include <netinet/in.h>
#include <net/if.h>
#include <string.h>
#include <stdio.h>

int get_mac(char* mac)
{
    int sockfd;
    struct ifreq tmp;   
    char mac_addr[30];

sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if( sockfd < 0)
    {
        perror("create socket fail\n");
        return -1;
    }

memset(&tmp,0,sizeof(struct ifreq));
    strncpy(tmp.ifr_name,"eth0",sizeof(tmp.ifr_name)-1);
    if( (ioctl(sockfd,SIOCGIFHWADDR,&tmp)) < 0 )
    {
        printf("mac ioctl error\n");
        return -1;
    }

sprintf(mac_addr, "%02x%02x%02x%02x%02x%02x",
            (unsigned char)tmp.ifr_hwaddr.sa_data[0],
            (unsigned char)tmp.ifr_hwaddr.sa_data[1],
            (unsigned char)tmp.ifr_hwaddr.sa_data[2],
            (unsigned char)tmp.ifr_hwaddr.sa_data[3],
            (unsigned char)tmp.ifr_hwaddr.sa_data[4],
            (unsigned char)tmp.ifr_hwaddr.sa_data[5]
            );
    printf("local mac:%s\n", mac_addr);
    close(sockfd);
    memcpy(mac,mac_addr,strlen(mac_addr));

return 0;
}

int main(int argc,char **argv)
{
    char mac[30];

get_mac(mac);
}

#ifndef _NET_IF_H
#define _NET_IF_H    1

#include <features.h>

#ifdef __USE_MISC
# include <sys/types.h>
# include <sys/socket.h>
#endif

/* Length of interface name.  */
#define IF_NAMESIZE    16

struct if_nameindex
  {
    unsigned int if_index;    /* 1, 2, ... */
    char *if_name;        /* null terminated name: "eth0", ... */
  };

#ifdef __USE_MISC
/* Standard interface flags. */
enum
  {
    IFF_UP = 0x1,        /* Interface is up.  */
# define IFF_UP    IFF_UP
    IFF_BROADCAST = 0x2,    /* Broadcast address valid.  */
# define IFF_BROADCAST    IFF_BROADCAST
    IFF_DEBUG = 0x4,        /* Turn on debugging.  */
# define IFF_DEBUG    IFF_DEBUG
    IFF_LOOPBACK = 0x8,        /* Is a loopback net.  */
# define IFF_LOOPBACK    IFF_LOOPBACK
    IFF_POINTOPOINT = 0x10,    /* Interface is point-to-point link.  */
# define IFF_POINTOPOINT IFF_POINTOPOINT
    IFF_NOTRAILERS = 0x20,    /* Avoid use of trailers.  */
# define IFF_NOTRAILERS    IFF_NOTRAILERS
    IFF_RUNNING = 0x40,        /* Resources allocated.  */
# define IFF_RUNNING    IFF_RUNNING
    IFF_NOARP = 0x80,        /* No address resolution protocol.  */
# define IFF_NOARP    IFF_NOARP
    IFF_PROMISC = 0x100,    /* Receive all packets.  */
# define IFF_PROMISC    IFF_PROMISC

/* Not supported */
    IFF_ALLMULTI = 0x200,    /* Receive all multicast packets.  */
# define IFF_ALLMULTI    IFF_ALLMULTI

IFF_MASTER = 0x400,        /* Master of a load balancer.  */
# define IFF_MASTER    IFF_MASTER
    IFF_SLAVE = 0x800,        /* Slave of a load balancer.  */
# define IFF_SLAVE    IFF_SLAVE

IFF_MULTICAST = 0x1000,    /* Supports multicast.  */
# define IFF_MULTICAST    IFF_MULTICAST

IFF_PORTSEL = 0x2000,    /* Can set media type.  */
# define IFF_PORTSEL    IFF_PORTSEL
    IFF_AUTOMEDIA = 0x4000,    /* Auto media select active.  */
# define IFF_AUTOMEDIA    IFF_AUTOMEDIA
    IFF_DYNAMIC = 0x8000    /* Dialup device with changing addresses.  */
# define IFF_DYNAMIC    IFF_DYNAMIC
  };

/* The ifaddr structure contains information about one address of an
   interface.  They are maintained by the different address families,
   are allocated and attached when an address is set, and are linked
   together so all addresses for an interface can be located.  */

struct ifaddr
  {
    struct sockaddr ifa_addr;    /* Address of interface.  */
    union
      {
    struct sockaddr    ifu_broadaddr;
    struct sockaddr    ifu_dstaddr;
      } ifa_ifu;
    struct iface *ifa_ifp;    /* Back-pointer to interface.  */
    struct ifaddr *ifa_next;    /* Next address for interface.  */
  };

# define ifa_broadaddr    ifa_ifu.ifu_broadaddr    /* broadcast address    */
# define ifa_dstaddr    ifa_ifu.ifu_dstaddr    /* other end of link    */

/* Device mapping structure. I'd just gone off and designed a
   beautiful scheme using only loadable modules with arguments for
   driver options and along come the PCMCIA people 8)

Ah well. The get() side of this is good for WDSETUP, and it'll be
   handy for debugging things. The set side is fine for now and being
   very small might be worth keeping for clean configuration.  */

struct ifmap
  {
    unsigned long int mem_start;
    unsigned long int mem_end;
    unsigned short int base_addr;
    unsigned char irq;
    unsigned char dma;
    unsigned char port;
    /* 3 bytes spare */
  };

/* Interface request structure used for socket ioctl's.  All interface
   ioctl's must have parameter definitions which begin with ifr_name.
   The remainder may be interface specific.  */

struct ifreq
  {
# define IFHWADDRLEN    6
# define IFNAMSIZ    IF_NAMESIZE
    union
      {
    char ifrn_name[IFNAMSIZ];    /* Interface 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 int ifru_flags;
    int ifru_ivalue;
    int ifru_mtu;
    struct ifmap ifru_map;
    char ifru_slave[IFNAMSIZ];    /* Just fits the size */
    char ifru_newname[IFNAMSIZ];
    __caddr_t ifru_data;
      } 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 _IOT_ifreq    _IOT(_IOTS(char),IFNAMSIZ,_IOTS(char),16,0,0)
# define _IOT_ifreq_short _IOT(_IOTS(char),IFNAMSIZ,_IOTS(short),1,0,0)
# define _IOT_ifreq_int    _IOT(_IOTS(char),IFNAMSIZ,_IOTS(int),1,0,0)

/* Structure used in SIOCGIFCONF request.  Used to retrieve interface
   configuration for machine (useful for programs which must know all
   networks accessible).  */

struct ifconf
  {
    int    ifc_len;            /* Size of buffer.  */
    union
      {
    __caddr_t ifcu_buf;
    struct ifreq *ifcu_req;
      } ifc_ifcu;
  };
# define ifc_buf    ifc_ifcu.ifcu_buf    /* Buffer address.  */
# define ifc_req    ifc_ifcu.ifcu_req    /* Array of structures.  */
# define _IOT_ifconf _IOT(_IOTS(struct ifconf),1,0,0,0,0) /* not right */
#endif    /* Misc.  */

__BEGIN_DECLS

/* Convert an interface name to an index, and vice versa.  */
extern unsigned int if_nametoindex (__const char *__ifname) __THROW;
extern char *if_indextoname (unsigned int __ifindex, char *__ifname) __THROW;

/* Return a list of all interfaces and their indices.  */
extern struct if_nameindex *if_nameindex (void) __THROW;

/* Free the data returned from if_nameindex.  */
extern void if_freenameindex (struct if_nameindex *__ptr) __THROW;

__END_DECLS

#endif /* net/if.h */

通过C语言获取MAC地址(转)的更多相关文章

  1. Linux系统下用C语言获取MAC地址

    最近在做一个小程序,需要用到在linux系统里编写C程序从而获取MAC地址,从网上搜了一遍,想总结一下.如果你就只需要单个功能的程序,可以采用方法一,见代码1,一般最好能够封装起来,写成获取MAC地址 ...

  2. 如何通过C语言获取主机WLAN下的IPv4地址,MAC地址

    #include "stdio.h" #include "windows.h" void GetHostWLAN_IPv4_AND_MAC(char IPv4[ ...

  3. 获取客户端Mac地址

    近期有个需求,需要获取客户端Mac地址作为白名单验证的依据.使用.net,B/S架构.先百度找了一些获取mac地址的方法, using System; using System.Collections ...

  4. Java获取本机的IP与MAC地址

    有些机器有许多虚拟的网卡,获取IP地址时会出现一些意外,所以需要一些验证: // 获取mac地址 public static String getMacAddress() { try { Enumer ...

  5. C#/VB.NET 获取电脑属性(硬盘ID、硬盘容量、Cpu序列号、MAC地址、系统类型)

    在开发过程中,经常需要获取电脑的一些属性,如获取硬盘ID/CPU序列号/MAC地址作为来加密字符串. 1.硬盘 在我查看网上一些文档时,发现很多人对硬盘序列号很模糊~ 什么叫硬盘序列号?指的是作为一个 ...

  6. (转载)详解网络传输中的三张表,MAC地址表、ARP缓存表以及路由表

    郑重声明:原文转载于http://dengqi.blog.51cto.com/5685776/1223132 向好文章致敬!!! 一:MAC地址表详解 说到MAC地址表,就不得不说一下交换机的工作原理 ...

  7. 手机电脑Mac地址修改方法

    1.什么是Mac地址? MAC(Media Access Control或者Medium Access Control)地址,意译为媒体访问控制,或称为物理地址.硬件地址,用来定义网络设备的位置.在O ...

  8. Web获取客户端物理MAC地址(ocx插件)

    主要是通过ActiveX控件 从本地获取到MAC地址,传入到浏览器打开的网页中,再提交到服务器. 具体详解与步骤看文档中: 文件实例包下载 DotNetFX 文件夹附件文件:(可能安装时需用) dot ...

  9. Mac地址

    Mac地址是每张网卡的唯一标识符,也叫物理地址.硬件地址或链路地址,由网络设备制造商生产时烧在网卡的ROM中,可以修改.现在的Mac地址一般都采用6字节48bit(还有2字节16bit的Mac地址,多 ...

随机推荐

  1. vue+iview多条联动,for循环data是函数

    问题:多条for循环出的数据二级联动for循环出多条数据,每条数据都有一个二级联动,每次下拉一级联动,二级的选项都是变化的. 思考刚开始一直想不出如何实现二级联动下拉的数据动态变化,因为之前一直都是v ...

  2. 洛谷 CF1012C Hills (动态规划)

    题目大意:有n个山丘 , 可以在山丘上建房子 , 建房子的要求是 : 该山丘的左右山丘严格的矮于该山丘 (如果有的话),你有一架挖掘机,每单位时间可以给一个山丘挖一个单位的高度,问你想要建造 1,2, ...

  3. Python实用笔记 (22)面向对象编程——实例属性和类属性

    由于Python是动态语言,根据类创建的实例可以任意绑定属性. 给实例绑定属性的方法是通过实例变量,或者通过self变量: class Student(object): def __init__(se ...

  4. git和github入门指南(3.1)

    3.远程管理 3.1.远程仓库相关命令 1.查看远程仓库名字,这里以github为例 git remote 上面命令执行后会得到:origin,这样一个名字,这个名字是我们克隆的时候默认设置好的 如果 ...

  5. php抽奖功能

    在项目开发中经常会遇到花钱抽奖类型的需求.但是老板总是担心用户用小钱抽到大奖.这样会导致项目亏损.下边这段代码可以有效制止抽奖项目亏钱. 个人奖池: 语言:thinkphp redis mysql 表 ...

  6. 消息总线(Bus)

    Spring Cloud Bus将分布式系统的节点与轻量级消息代理链接.可以用于通知状态更改(例如配置更改)或其他管理指令.一个关键的地方是,Bus就像一个分布式执行器,用于扩展的Spring Boo ...

  7. Centos 6.4 安装KSnapshot 和gimp截图工具

    一. # wget http://www.ibiblio.org/pub/Linux/X11/xutils/ksnapshot-0.2.7.tar.gz # tar -zxvf ksnapshot-0 ...

  8. CSS3样式_实现字体发光效果

    text-shadow 属性仅仅是用来设置文本阴影的,似乎并不能实现字体发光效果.其实不然,这正是 text-shadow 属性的精妙之处.当阴影的水平偏移量和垂直偏移量都为0时,阴影就和文本重合了. ...

  9. ansible 2.7 API

    # coding:utf-8 # @Time : 2019-01-14 15:22 # @Author : 小贰 # @FileName: ansible_sync_hosts.py # @funct ...

  10. web前端知识点(JavaScript篇)

    call,apply,bind call,apply,bind这三者的区别,及内部实现原理,点这里 promise promise函数的内部实现原理,点这里 闭包 闭包就是能够读取其他函数内部变量的函 ...