#define SIOCAJSMODE SIOCDEVPRIVATE
#define SIOCAJGMODE SIOCAJSMODE + 1
int channel;
char ifname[IFNAMSIZ];
int sockfd;
static int get_socket (void)
{
struct sockaddr_ll addr;
struct ifreq req;
struct aj_config aj_conf;
int sockfd, flags;
if((sockfd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL))) < 0)
{
return(-1);
}
/* get the interface index */
memset(&req, 0, sizeof(struct ifreq));
memset(&aj_conf, 0, sizeof(struct aj_config));
strcpy(req.ifr_name, ifname);
if(ioctl(sockfd, SIOCGIFINDEX, &req) < 0) // 第一个
{
return(-2);
}
printf("interafce Index:%d\n",req.ifr_ifindex);
/* bind the socket to the interface */
memset(&addr, 0, sizeof(struct sockaddr_ll));
addr.sll_ifindex = req.ifr_ifindex;
addr.sll_protocol = htons(ETH_P_ALL);
addr.sll_family = PF_PACKET;
if(bind(sockfd, (struct sockaddr *)&addr, sizeof(struct sockaddr_ll)) < 0)
{
return(-3);
}
req.ifr_data = (char *)&aj_conf;
if(ioctl(sockfd, SIOCAJGMODE, &req) < 0) //第二个 参数SIOCAJGMODE定义见上方
{
return(-4);
}
if(channel != -1)
{
aj_conf.channel = channel;
}
memcpy(aj_conf.ownmac, killedmac, 6);
aj_conf.mode = 6;
aj_conf.monitor = 0;
if(ioctl(sockfd, SIOCAJSMODE, &req) < 0) //第三个 参数SIOCAJSMODE定义见上方
{
return(-4);
}
if((flags = fcntl(sockfd, F_GETFL)) < 0)
{
return(-5);
}
if(fcntl(sockfd, F_SETFL, flags|O_NONBLOCK) < 0)
{
return(-6);
} return(sockfd);
}
上面的代码是发送802.11无线数据帧程序的部分代码,其中一共有三个ioctl函数,但是运行的时候会显示get_socket: Operation not supported。
沧海一幻觉