Печать MAC-адреса - PullRequest
       4

Печать MAC-адреса

7 голосов
/ 19 мая 2011

Это код, который получает некоторую информацию о сети, проблема в том, что когда он печатает MAC-адрес, он печатает его когда-нибудь нормально, а иногда с помощью fff, например 00: 21: 84: a2: 12: 88 и 00: ffffff21: 84:a2: 12: ffffff88 изменяется от машины к другой

здесь есть код

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
#include <time.h>
#include <sys/ioctl.h>
#include <netinet/in.h>
#include <net/ethernet.h>
#include <net/if.h>
#include <arpa/inet.h>
#include <sys/types.h>
#    include <netinet/if_ether.h>
#define IP_QUAD(ip)  (ip)>>24,((ip)&0x00ff0000)>>16,((ip)&0x0000ff00)>>8,((ip)&0x000000ff)
#define IP_ADDR_LEN 4
struct {
    char *dev;
    int sd;
    struct ether_addr eth;
    struct in_addr ip;
    struct in_addr bcast;
    unsigned int mtu;
} local_info ;

struct ifreq eth_init(char*,struct ifreq);
struct ifreq eth_get_info(struct ifreq);
struct ifreq eth_get_bcast(struct ifreq);

int
main(int argc,char **argv){
    int sd;
    struct ifreq ifr;
    if(argc != 2){
    fprintf(stderr,"usage: <command> <devicename>\n");
    exit(1);
    }
    ifr = eth_init(argv[1],ifr);
    ifr = eth_get_info(ifr);

    printf("> Exiting...\n");
    return(0);
}

struct ifreq
eth_init(char *dev,struct ifreq ifr){
//Intitating Socket     
if((local_info.sd = socket(PF_INET,SOCK_PACKET,(ETH_P_ALL))) < 0){
        printf("> Error initating the ethernet socket..\n");
        exit(-1);
    }
//Yupeeeeeeee Descriptor open 
    printf("> Initated Ethernet socket on Descriptor (%x)\n",local_info.sd);
//Set global variables
    local_info.dev = dev;
    return ifr;
}
struct ifreq
eth_get_info(struct ifreq ifr){
    int i = ETHER_ADDR_LEN;
    char* ptr;
    memset(&ifr,0,sizeof(ifr));
    strncpy(ifr.ifr_name,local_info.dev,sizeof(ifr.ifr_name));
    //Getting MAC
    if(ioctl(local_info.sd,SIOCGIFHWADDR,&ifr) < 0){
            printf("> Error Getting the Local Mac address\n");
            exit(-1);
        }
    printf("> Successfully received Local MAC Address : %02x:%02x:%02x:%02x:%02x:%02x\n",
                ifr.ifr_hwaddr.sa_data[0],ifr.ifr_hwaddr.sa_data[1],ifr.ifr_hwaddr.sa_data[2]
                ,ifr.ifr_hwaddr.sa_data[3],ifr.ifr_hwaddr.sa_data[4],ifr.ifr_hwaddr.sa_data[5]);

        memcpy(&(local_info.eth),&ifr.ifr_hwaddr.sa_data,ETH_ALEN);


    // Getting IP Address
        memset(&ifr,0,sizeof(ifr));
        strncpy(ifr.ifr_name,local_info.dev,sizeof(ifr.ifr_name));
        if( ioctl(local_info.sd,SIOCGIFADDR,&ifr) < 0){ 
                printf("> Error gettint the local IP address\n");
                exit(-1);
        }   
        printf("> Successfully received the IP Address %s\n",inet_ntoa((*(struct sockaddr_in *)&ifr.ifr_addr).sin_addr));
        memcpy(&(local_info.ip.s_addr),&(*(struct sockaddr_in *)&ifr.ifr_addr).sin_addr.s_addr,IP_ADDR_LEN);

            // Get MTU
        memset(&ifr,0,sizeof(ifr));
        strncpy(ifr.ifr_name,local_info.dev,sizeof(ifr.ifr_name));
        if ( ioctl(local_info.sd,SIOCGIFMTU,&ifr) < 0){
                printf("> Error Getting the MTU Value\n");
                exit(-1);
        }
        printf("> Recevied Successfully the MTU Value \n");
        local_info.mtu = ifr.ifr_mtu;


    return ifr;
}

struct ifreq
eth_get_bcast(struct ifreq ifr){
/* get broadcast addr for size */
        memset(&ifr,0,sizeof(ifr));
        strncpy(ifr.ifr_name, local_info.dev, sizeof (ifr.ifr_name));
        if (ioctl(local_info.sd, SIOCGIFBRDADDR, &ifr) < 0 ) { 
           printf("> Error getting the Broadcast address\n");
           exit(-1);
        }
        printf("> Received the BroadCast address: %s\n",inet_ntoa((*(struct sockaddr_in *)&ifr.ifr_addr).sin_addr));
        memcpy(&(local_info.bcast.s_addr),
               &(*(struct sockaddr_in *)&ifr.ifr_addr).sin_addr.s_addr,
               IP_ADDR_LEN);

    return ifr;
}

проблема в функции eth_get_info сектора MAC, оператора печати

anyрешения, как это исправить?

Ответы [ 4 ]

13 голосов
/ 19 мая 2011

Это похоже на проблему со знаком / без знака.

Попробуйте привести к неподписанному символу:

  printf("> Successfully received Local MAC Address : %02x:%02x:%02x:%02x:%02x:%02x\n",
  (unsigned char) ifr.ifr_hwaddr.sa_data[0],
  (unsigned char) ifr.ifr_hwaddr.sa_data[1],
  (unsigned char) ifr.ifr_hwaddr.sa_data[2],
  (unsigned char) ifr.ifr_hwaddr.sa_data[3],
  (unsigned char) ifr.ifr_hwaddr.sa_data[4],
  (unsigned char) ifr.ifr_hwaddr.sa_data[5]);
6 голосов
/ 09 апреля 2013

Хотя здесь уже принят принятый ответ, есть лучшее решение в netinet/ether.h.

Учитывая, что адреса Mac обычно хранятся в типах u_int8_t, как в структуре ether_addr:

Вы можете просто сделать это:

printf("Mac Address: %s", ether_ntoa((struct ether_addr*)ar->sa));

в моем случае ar выглядит примерно так:

struct {
   u_int8_t sa[6];
}

Вы можете легко скопировать это в другой буфер с чем-токак asprintf:

char *formatted_mac_address;
asprintf(formatted_mac_address, "Mac Address: %s", ether_ntoa((struct ether_addr*)ar->sa));

Если у вас нет структуры, как у меня, вы также можете просто использовать адрес любого u_int8_t вместо ar->sa.

Подходящие заголовки и т. Д. Должны быть вставлены, но это будет выглядеть на много лучше, чем принятое здесь решение.

0 голосов
/ 09 ноября 2016

Вот простая программа на C для поиска MAC-адреса системы:

#include<stdio.h>
#include<stdlib.h>

int main() {
    system("getmac");
    return 0;
}
0 голосов
/ 19 ноября 2013

Я предпочитаю использовать явный модификатор длины в строке формата для значений короче, чем int. Например, %02hhx вместо %02x для однобайтовых значений. Это позволяет мне не беспокоиться об этих тонких вопросах конверсии и продвижения:

#include <stdio.h>

int main(void)
{
    signed char sff = '\xff';
    unsigned char uff = '\xff';

    printf("signed:   %02x %02hhx\n", sff, sff);
    printf("unsigned: %02x %02hhx\n", uff, uff);

    return 0;
}

печать

signed:   ffffffff ff
unsigned: ff ff
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...