2013-08-01 2 views
1

J'essaie d'obtenir l'adresse MAC d'une interface avec laquelle je veux travailler.socket cru: inapproprié ioctl

J'utiliser ce code pour le faire, mais je reçois toujours le message d'erreur « ioctl inappropriée pour le dispositif »

je l'ai déjà essayé d'utiliser une autre prise, à savoir AF_INET avec SOCK_DGRAM (si je besoin de la prise première pour utilisation ultérieure) sans aucune différence.

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

Vous savez que vous copiez beaucoup plus que le nom de l'interface à 'ifr.ifr_name'? –

+0

@JoachimPileborg Je suis maintenant, fixe, mais il n'a rien changé – Horstinator

Répondre

6

Le problème devrait être assez évident si vous avez activé plusieurs avertissements:

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

Cédant au-dessus du résultat de la comparaison -sock, et bien sûr ce n'est pas la prise valide.

Au lieu de cela, vous devez utiliser des parenthèses pour éviter le problème operator precedence:

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

merci, j'ai totalement raté cela ... = / – Horstinator

Questions connexes