簡體   English   中英

原始套接字:不適當的ioctl

[英]raw socket: inappropriate ioctl

我嘗試獲取要使用的接口的mac地址。

我使用此代碼來執行此操作,但總是收到錯誤消息“設備的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 ,當然,它不是有效的套接字。

相反,您需要使用括號來避免運算符優先級問題:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM