// luo
// gcc mac.c
// sudo ./a.out
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <net/if.h>
#include <sys/types.h>
#include <stdlib.h>
#include <net/if_arp.h>
int main()
{
struct ifreq ifreq;
int socket_id;
int ret, i;
char ifname[]="eth0";
char mac_addr[18] = "08:00:27:88:88:88";
char temp[6]= {0};
//==========================================
printf("ifconfig eth0 down \n");
socket_id = socket(AF_INET,SOCK_STREAM,0);
strncpy(ifreq.ifr_name, ifname, IFNAMSIZ);
ifreq.ifr_flags &= ~IFF_UP; // ifconfig donw
//ifreq.ifr_flags |= IFF_UP; // ifconfig up
ret = ioctl(socket_id, SIOCSIFFLAGS, &ifreq);
close(socket_id);
sleep(3);
//==========================================
socket_id = socket(AF_INET,SOCK_STREAM,0);
ifreq.ifr_addr.sa_family = ARPHRD_ETHER;
strcpy(ifreq.ifr_name, ifname);
sscanf(mac_addr, "%hhx:%hhx:%hhx:%hhx:%hhx:%hhx", \
&temp[0], &temp[1], \
&temp[2], &temp[3], \
&temp[4], &temp[5] );
for(i=0; i<6; i++)
{
//printf("%x:", temp[i]);
ifreq.ifr_hwaddr.sa_data[i]= temp[i];
printf("%x:", ifreq.ifr_hwaddr.sa_data[i]);
}
// memcpy((unsigned char *)ifreq.ifr_hwaddr.sa_data, temp, 6);
ret = ioctl(socket_id, SIOCSIFHWADDR, &ifreq);
if(ret < 0)
{
perror("error ioctl");
return -1;
}
close(socket_id);
//==========================================
printf("ifconfig eth0 up \n");
socket_id = socket(AF_INET,SOCK_STREAM,0);
strncpy(ifreq.ifr_name, ifname, IFNAMSIZ);
//ifreq.ifr_flags &= ~IFF_UP; // ifconfig donw
ifreq.ifr_flags |= IFF_UP; // ifconfig up
ret = ioctl(socket_id, SIOCSIFFLAGS, &ifreq);
close(socket_id);
return 0;
}
// gcc mac.c
// sudo ./a.out
// http://www.360doc.com/content/12/0406/08/1317564_201298802.shtml
// http://www.cnblogs.com/tzhangofseu/archive/2012/05/10/2493846.html
#include <stdio.h>#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <net/if.h>
#include <sys/types.h>
#include <stdlib.h>
#include <net/if_arp.h>
int main()
{
struct ifreq ifreq;
int socket_id;
int ret, i;
char ifname[]="eth0";
char mac_addr[18] = "08:00:27:88:88:88";
char temp[6]= {0};
//==========================================
printf("ifconfig eth0 down \n");
socket_id = socket(AF_INET,SOCK_STREAM,0);
strncpy(ifreq.ifr_name, ifname, IFNAMSIZ);
ifreq.ifr_flags &= ~IFF_UP; // ifconfig donw
//ifreq.ifr_flags |= IFF_UP; // ifconfig up
ret = ioctl(socket_id, SIOCSIFFLAGS, &ifreq);
close(socket_id);
sleep(3);
//==========================================
socket_id = socket(AF_INET,SOCK_STREAM,0);
ifreq.ifr_addr.sa_family = ARPHRD_ETHER;
strcpy(ifreq.ifr_name, ifname);
sscanf(mac_addr, "%hhx:%hhx:%hhx:%hhx:%hhx:%hhx", \
&temp[0], &temp[1], \
&temp[2], &temp[3], \
&temp[4], &temp[5] );
for(i=0; i<6; i++)
{
//printf("%x:", temp[i]);
ifreq.ifr_hwaddr.sa_data[i]= temp[i];
printf("%x:", ifreq.ifr_hwaddr.sa_data[i]);
}
// memcpy((unsigned char *)ifreq.ifr_hwaddr.sa_data, temp, 6);
ret = ioctl(socket_id, SIOCSIFHWADDR, &ifreq);
if(ret < 0)
{
perror("error ioctl");
return -1;
}
close(socket_id);
//==========================================
printf("ifconfig eth0 up \n");
socket_id = socket(AF_INET,SOCK_STREAM,0);
strncpy(ifreq.ifr_name, ifname, IFNAMSIZ);
//ifreq.ifr_flags &= ~IFF_UP; // ifconfig donw
ifreq.ifr_flags |= IFF_UP; // ifconfig up
ret = ioctl(socket_id, SIOCSIFFLAGS, &ifreq);
close(socket_id);
return 0;
}