Это код, который получает некоторую информацию о сети, проблема в том, что когда он печатает 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решения, как это исправить?