【问题标题】:raw socket: inappropriate ioctl原始套接字:不适当的 ioctl
【发布时间】:2013-08-02 08:12:15
【问题描述】:

我尝试获取我想要使用的接口的 mac 地址。

我使用此代码执行此操作,但我总是收到错误消息“设备的 ioctl 不合适 "

我已经尝试过使用不同的套接字,即带有 SOCK_DGRAM 的 AF_INET(尽管我需要原始套接字供以后使用),没有任何区别。

#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]);
}

【问题讨论】:

  • 您知道您复制的不仅仅是接口名称到ifr.ifr_name
  • @JoachimPileborg 我现在,修复它,但它没有改变任何东西

标签: c linux sockets ioctl


【解决方案1】:

如果您打开更多警告,问题应该很明显:

if(sock = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ARP)) < 0)

上面将比较的结果赋值给sock,当然不是合法的socket。

您需要使用括号来避免operator precedence 问题:

if((sock = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ARP))) < 0)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-05
    • 1970-01-01
    • 2011-09-22
    • 1970-01-01
    • 2018-12-13
    • 2011-02-06
    • 1970-01-01
    相关资源
    最近更新 更多