使用ioctl SIOCSIFHWADDR设置MAC要使用ARPHRD_ETHER
来源:互联网 发布:java判断object的类型 编辑:程序博客网 时间:2024/06/04 23:36
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <sys/ioctl.h>
#include <net/if.h>
#include <net/if_arp.h>
#define ETHER_ADDR_LEN 6
#define UP 1
#define DOWN 0
int get_mac_addr(char *ifname, char *mac)
{
int fd, rtn;
struct ifreq ifr;
if( !ifname || !mac ) {
return -1;
}
fd = socket(AF_INET, SOCK_DGRAM, 0 );
if ( fd < 0 ) {
perror("socket");
return -1;
}
ifr.ifr_addr.sa_family = AF_INET;
strncpy(ifr.ifr_name, (const char *)ifname, IFNAMSIZ - 1 );
if ( (rtn = ioctl(fd, SIOCGIFHWADDR, &ifr) ) == 0 )
memcpy( mac, (unsigned char *)ifr.ifr_hwaddr.sa_data, 6);
close(fd);
return rtn;
}
int set_mac_addr(char *ifname, char *mac)
{
int fd, rtn;
struct ifreq ifr;
if( !ifname || !mac ) {
return -1;
}
fd = socket(AF_INET, SOCK_DGRAM, 0 );
if ( fd < 0 ) {
perror("socket");
return -1;
}
ifr.ifr_addr.sa_family = ARPHRD_ETHER;
strncpy(ifr.ifr_name, (const char *)ifname, IFNAMSIZ - 1 );
memcpy((unsigned char *)ifr.ifr_hwaddr.sa_data, mac, 6);
if ( (rtn = ioctl(fd, SIOCSIFHWADDR, &ifr) ) != 0 ){
perror("SIOCSIFHWADDR");
}
close(fd);
return rtn;
}
int if_updown(char *ifname, int flag)
{
int fd, rtn;
struct ifreq ifr;
if (!ifname) {
return -1;
}
fd = socket(AF_INET, SOCK_DGRAM, 0 );
if ( fd < 0 ) {
perror("socket");
return -1;
}
ifr.ifr_addr.sa_family = AF_INET;
strncpy(ifr.ifr_name, (const char *)ifname, IFNAMSIZ - 1 );
if ( (rtn = ioctl(fd, SIOCGIFFLAGS, &ifr) ) == 0 ) {
if ( flag == DOWN )
ifr.ifr_flags &= ~IFF_UP;
else if ( flag == UP )
ifr.ifr_flags |= IFF_UP;
}
if ( (rtn = ioctl(fd, SIOCSIFFLAGS, &ifr) ) != 0) {
perror("SIOCSIFFLAGS");
}
close(fd);
return rtn;
}
/*
* Convert Ethernet address string representation to binary data
* @param a string in xx:xx:xx:xx:xx:xx notation
* @param e binary data
* @return TRUE if conversion was successful and FALSE otherwise
*/
int
ether_atoe(const char *a, unsigned char *e)
{
char *c = (char *) a;
int i = 0;
memset(e, 0, ETHER_ADDR_LEN);
for (;;) {
e[i++] = (unsigned char) strtoul(c, &c, 16);
if (!*c++ || i == ETHER_ADDR_LEN)
break;
}
return (i == ETHER_ADDR_LEN);
}
/*
* Convert Ethernet address binary data to string representation
* @param e binary data
* @param a string in xx:xx:xx:xx:xx:xx notation
* @return a
*/
char *
ether_etoa(const unsigned char *e, char *a)
{
char *c = a;
int i;
for (i = 0; i < ETHER_ADDR_LEN; i++) {
if (i)
*c++ = ':';
c += sprintf(c, "%02X", e[i] & 0xff);
}
return a;
}
- 使用ioctl SIOCSIFHWADDR设置MAC要使用ARPHRD_ETHER
- python 使用ioctl() 获得网卡IP 和MAC地址
- Linux下使用ioctl设置v4l2摄像头参数--------案例二
- jni 调用V4L2使用ioctl设置v4l2摄像头参数
- ioctl函数的使用
- ioctl函数的使用
- ioctl函数的使用
- ioctl函数使用技巧
- ioctl()函数使用
- ioctl相关使用
- ioctl的使用步骤
- 函数ioctl的使用
- Linux系统ioctl使用示例 ioctl实验
- linux下使用ioctl() 获取本机mac地址、ip地址等等
- Linux 修改MAC地址提示:SIOCSIFHWADDR: Cannot assign requested address
- OpenWrt Mac地址修改错误SIOCSIFHWADDR: Cannot assign requested address
- 修改MAC错误ifconfig:SIOCSIFHWADDR: Cannot assign requested address
- linux系统ioctl使用示例
- Android studio 下载地址
- 推送的时候的过渡动画一些枚举
- 基于WSDL文件反向编译生成Java类(使用Axis开源框架)
- UNIX环境C语言编程(6)-进程环境
- CImg库下载
- 使用ioctl SIOCSIFHWADDR设置MAC要使用ARPHRD_ETHER
- 07-1. 换个格式输出整数 (15)
- GATEWAY获取与设置(Linux C)
- 转载 Android4: Write Storage权限问题
- Installing Oracle Configuration Manager(OCM)
- 如何才能让自己的新站快速的通过搜索引擎的考核期?
- 冬令营第五天
- 07-2. A+B和C (15)
- Android动画