原始套接字:不适当的ioctl
问题描述:
我尝试获取我想要使用的接口的mac地址。原始套接字:不适当的ioctl
我使用此代码这样做,但我总是得到错误信息“的设备 不适当的ioctl”
我已经使用了不同的插座,即AF_INET与SOCK_DGRAM(试过,虽然我需要原始套接字以后使用)没有任何区别。
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <linux/if_ether.h>
#include <net/if.h>
int main()
{
char if_name[] = "eth0";
char mac[ETH_ALEN];
struct ifreq ifr;
int sock;
if(sock = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ARP)) < 0)
{
perror("SOCKET");
return 1;
}
// get mac address of our interface
memset(&ifr, 0, sizeof(struct ifreq));
memcpy(ifr.ifr_name, if_name, 4);
if(ioctl(sock, SIOCGIFHWADDR, &ifr) == -1)
{
perror("SIOCGIFHWADDR");
return 1;
}
memcpy(mac, ifr.ifr_hwaddr.sa_data, ETH_ALEN);
printf("%x.%x.%x.%x.%x.%x\n", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
}
答
的问题应该是很明显的,如果你打开更多的警告:
if(sock = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ARP)) < 0)
的比较的结果,上述分配给sock
,当然它不是有效的套接字。
相反,你需要使用括号来避免operator precedence问题:
if((sock = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ARP))) < 0)
+0
谢谢,我完全错过了...... = / – Horstinator
您知道您复制大于接口名称为'ifr.ifr_name'得多? –
@JoachimPileborg我现在,修复它,但它没有改变任何东西 – Horstinator