2016-10-01 3 views
0

Une adresse MAC est analysée dans un tableau d'octets (macaddr). Les octets sont imprimés avec printf() l'un après l'autre. Les octets sont censés ressembler à paires de caractères hexadécimaux. Mais certains d'entre eux sont rembourrés avec f caractères.Problèmes lors de l'impression d'une adresse MAC

Par exemple, pour macaddr[3] il imprime 'ffffffcc' plutôt que 'cc', à savoir 4 octets au lieu de seul octet. Le reste des éléments du tableau sont imprimés correctement (macaddr[0] = 00, macaddr[1] = AA, macaddr[2] = BB, etc.)

Quel est le problème? S'il vous plaît aidez-moi à comprendre ce qui ne va pas avec le programme.

#include <stdio.h> 
#include <net/if.h> // struct ifconf 
#include <errno.h> 
#include <libnet.h> 
#include <pcap.h> 
#include <stdlib.h> 
#include <unistd.h> 

int getmacaddr() ; 

int main(int argc, char *argv[]) 
{ 
    getmacaddr();  
} 

int getmacaddr() 
{ 
    struct ifconf ifc; 
    struct ifreq *ifr; 
    int sfd; 
    int i; 
    int devnums; 
    char macaddr[ETHER_ADDR_LEN]; 

    ifc.ifc_req = NULL; 

    sfd = socket(AF_INET,SOCK_DGRAM,0); 
    if(sfd == -1) 
    { 
     perror("socket : "); 
     return -1; 
    } 

    // get ifc.ifc_len 
    if(ioctl(sfd,SIOCGIFCONF,&ifc) == -1) 
    { 
     perror("ioctl - SIOCGIFCONF : "); 
     return -1; 
    } 
    devnums = ifc.ifc_len/sizeof(struct ifreq); 

    // malloc ifc.ifc_buf and get IFCONF list 
    ifc.ifc_buf = malloc(ifc.ifc_len); 
    memset(ifc.ifc_buf,0x0,ifc.ifc_len); 

    if(ioctl(sfd,SIOCGIFCONF,&ifc) == -1) 
    { 
     perror("ioctl - SIOCGIFCONF : "); 
     return -1; 
    } 


    for(i = 0; i < devnums; i++,ifc.ifc_req++) 
    { 
     // idfy dev 
     if(strcmp(ifc.ifc_req->ifr_ifrn.ifrn_name,"lo") && ifc.ifc_req->ifr_ifrn.ifrn_name != 0) 
     { 
      ifr = ifc.ifc_req; 

      // IP address 
      struct sockaddr_in *a = (struct sockaddr_in *) &ifr->ifr_addr; 
      printf("%s",inet_ntoa(a->sin_addr)); 
      printf("\n"); 

      //get IFHWADDR 
      if(ioctl(sfd,SIOCGIFHWADDR,ifr) == -1) 
      { 
       perror("ioctl - SIOCGIFHWADDR : "); 
       return -1; 
      }    
     } 
    } 

    memcpy(macaddr,ifr->ifr_hwaddr.sa_data,sizeof(macaddr)); 
    for(i = 0; i < ETHER_ADDR_LEN; i++) 
    { 
     printf("%02x ",macaddr[i]); 
    } 
    printf("\n"); 

    close(sfd); 
    // free(ifc.ifc_buf); <- ?? error 

    return 0; 
} 

EDIT

J'ai remplacé la ligne suivante:

printf("%02x ",macaddr[i]); 

avec

printf("%02x ", (macaddr[i] & 0xff)); 

Répondre

0

Essayez ceci:

printf("%02x ", (unsigned char)macaddr[i] & 0xff); 

Nous spécifions la largeur de champ minimum dans la chaîne de format. Donc, pour vous assurer que la valeur ressemblera exactement à un seul octet, vous pouvez ne conserver que les 16 premiers bits en appliquant un masque de bits.

+0

wow je ne pouvais pas penser cela. Je vais essayer. Merci!! – black

+0

J'ai résolu le problème, mais je suis toujours curieux de savoir pourquoi macaddr [3] imprimer 'ffffffcc'. de toute façon merci beaucoup! – black

+0

@black, hmm, il devrait y avoir un autre problème. Pourriez-vous mettre à jour votre message avec le nouveau code? –