搜索热词
下面是编程之家 jb51.cc 通过网络收集整理的代码片段。
编程之家小编现在分享给大家,也给大家做个参考。
/*
* getmac.c
*
* Created on: 2010-11-4
* Author: carl
*/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define IFNAMSIZ 16
// data structs to store interface name list
char ifname_buf[2048];
char *ifnames = ifname_buf;
int count = 0;
void add_interface_name(const char * name)
{
int i;
for (i=0;i
{
if (!strcmp(ifnames+i*IFNAMSIZ,name))
return;
}
strncpy(ifnames+(count++)*IFNAMSIZ,name,IFNAMSIZ-1);
}
char * get_name(char *name,char *p)
{
while (isspace(*p))
p++;
while (*p) {
if (isspace(*p))
break;
if (*p == ':') { /* could be an alias */
char *dot = p,*dotname = name;
*name++ = *p++;
while (isdigit(*p))
*name++ = *p++;
if (*p != ':') { /* it wasn't,backup */
p = dot;
name = dotname;
}
if (*p == '\0')
return NULL;
p++;
break;
}
*name++ = *p++;
}
*name++ = '\0';
return p;
}
// get /proc/net/dev interface name list into buffer
// return 0 if success
int get_procnet_list()
{
FILE *fh;
char buf[512];
fh = fopen("/proc/net/dev","r");
if (!fh)
return -1;
fgets(buf,sizeof buf,fh); /* eat title lines */
fgets(buf,fh);
while (fgets(buf,fh))
{
char name[IFNAMSIZ];
get_name(name,buf);
add_interface_name(name);
}
fclose(fh);
return 0;
}
long mac_addr_sys ( u_char *addr)
{
/* implementation for Linux */
struct ifreq ifr;
struct ifreq *IFR;
struct ifconf ifc;
char buf[1024];
int s,i;
int ok = 0;
// clear buffer
memset(ifname_buf,sizeof(ifname_buf));
s = socket(AF_INET,SOCK_DGRAM,0);
if (s==-1) {
return -1;
}
ifc.ifc_len = sizeof(buf);
ifc.ifc_buf = buf;
ioctl(s,SIOCGIFCONF,&ifc);
IFR = ifc.ifc_req;
// put the ioctl interface names in the list
for (i = ifc.ifc_len / sizeof(struct ifreq); --i >= 0; IFR++) {
add_interface_name(IFR->ifr_name);
}
// put the /proc/net/dev interface names in the list
if (get_procnet_list())
return -1;
// get the first mac address of eth* device hardware address
for (i = 0; i < count; i++) {
strcpy(ifr.ifr_name,ifnames + i*IFNAMSIZ);
if (!strncmp(ifr.ifr_name,"eth",3))
if (ioctl(s,SIOCGIFFLAGS,&ifr) == 0) {
if (! (ifr.ifr_flags & IFF_LOOPBACK)) {
if (ioctl(s,SIOCGIFHWADDR,&ifr) == 0) {
char *p = (char *)ifr.ifr_hwaddr.sa_data;
if (!*((int *)p) && !*((int *)(p+2)) )
continue;
// if not 00:00:00:00:00:00,yes,we get the real mac addr
ok = 1;
break;
}
}
}
}
close(s);
if (ok) {
bcopy( ifr.ifr_hwaddr.sa_data,addr,6);
}
else {
return -1;
}
return 0;
}
/***********************************************************************/
/*
* Main (only for testing)
*/
int main( int argc,char **argv)
{
long stat;
int i;
u_char addr[6];
stat = mac_addr_sys( addr);
if (0 == stat) {
printf( "MAC address = ");
for (i=0; i<6; ++i) {
printf("%2.2x",addr[i]);
if (i<5)
printf(":");
}
printf( "\n");
}
else {
fprintf( stderr,"can't get MAC address\n");
exit( 1);
}
return 0;
}
以上是编程之家(jb51.cc)为你收集整理的全部代码内容,希望文章能够帮你解决所遇到的程序开发问题。
如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。
总结
如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。