Linux下修改網絡硬件的物理地址

今天看到個C語言的修改網絡MAC地址,非常好用,與大家分享下:

#include 
#include 
#include 
#include 
......

struct ifreq ifr;
struct sockaddr_in *sin;
struct sockaddr sap;

int err;
int sockfd;

char *addr_ip = "192.168.1.221";

system("ifconfig eth0 down");

sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if(sockfd < 0) {
    perror("socket error");
}

bzero(&ifr, sizeof(ifr));
strncpy(ifr.ifr_name, "eth0", sizeof(ifr.ifr_name)-1);

sin = (struct sockaddr_in *)&ifr.ifr_addr;
sin->sin_family = AF_INET;

err = inet_pton(AF_INET, addr_ip, &sin->addr);
if(err < 0) {
    perror("inet_pton error");
}

err = ioctl(sockfd, SIOCSIFADDR, &ifr);
if(err < 0) {
    perror("ioctl SIOCSIFADDR error");
}

sap.sa_family = ARPHRD_ETHER;
sa.sa_data[0] = 0x1A;//硬件地址,可以根據撥碼開關的值來動態變更
sa.sa_data[1] = 0x2B;
sa.sa_data[2] = 0x3C;
sa.sa_data[3] = 0x4D;
sa.sa_data[4] = 0x5E;
sa.sa_data[5] = 0x6F;

memcpy(((char *)(&ifr) + offsetof(struct ifreq, ifr_hwaddr)), 
    (char *)&sap, 
    sizeof(struct sockaddr));
err = ioctl(sockfd, SIOCSIFHWADDR, &ifr);
if(err < 0) {
    perror("ioctl SIOCSIFHWADDR error");
}

system("ifconfig eth0 up");

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章