C语言把mac地址转为6字节数组,通过C语言获取MAC地址(转)

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

#include

#include

#include

#include

#include

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

#ifdef __USE_MISC

# include

# include

#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 */

原文:http://www.cnblogs.com/shizhai/p/3746527.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值