#include<stdio.h>
#include
<stdlib.h>
#include
<string.h>
#include
<errno.h>
#include
<unistd.h>
#include
<sys/socket.h>
#include
<sys/ioctl.h>
#include
<net/if.h>
#include
<net/if_arp.h>
#include
<arpa/inet.h>
#define inaddrr( x)
( *(
structin_addr
* )&ifr->x[sizeof(
sa.sin_port)
] )
#define IFRSIZE(
( int
)( size*
sizeof(struct ifreq
) )
)
int main (
void )
{
unsigned char* u;
int sockfd, size= 1;
struct ifreq * ifr;
struct ifconf ifc;
struct sockaddr_in sa;
if ( 0
> ( sockfd =socket(
AF_INET,
SOCK_DGRAM,IPPROTO_IP
) )
)
{
fprintf(stderr,
"Cannot open socket.\n"
);
exit(
EXIT_FAILURE );
}
ifc.ifc_req =NULL;
do
{
++size;
/* realloc buffer size until no overflow occurs */
if (
NULL ==
( ifc.ifc_req =realloc( ifc.ifc_req, IFRSIZE)
) )
{
fprintf(stderr,
"Out of memory.\n" );
exit(EXIT_FAILURE
);
}
ifc.ifc_len = IFRSIZE;
if ( ioctl( sockfd,SIOCGIFCONF,
&ifc )
)
{
perror("ioctl SIOCFIFCONF"
);
exit(EXIT_FAILURE
);
}
} while
( IFRSIZE <= ifc.ifc_len);
ifr = ifc.ifc_req;
for (
; ( char*
)ifr <
( char*
)ifc.ifc_req+ ifc.ifc_len;++ifr
)
{
if ( ifr->ifr_addr.sa_data==
( ifr + 1
)->ifr_addr.sa_data)
{
continue;/* duplicate, skip it */
}
if ( ioctl( sockfd,SIOCGIFFLAGS, ifr)
)
{
continue;/* failed to get flags, skip it */
}
printf("Interface: %s\n", ifr->ifr_name);
if ( 0
== ioctl( sockfd,SIOCGIFHWADDR, ifr)
)
{
switch ( ifr->ifr_hwaddr.sa_family)
{
case ARPHRD_NETROM:
case ARPHRD_ETHER:
case ARPHRD_PPP:
case ARPHRD_EETHER:
case ARPHRD_IEEE802:
break;
default:
printf("\n"
);
continue;
}
u = (unsigned
char *
)&ifr->ifr_addr.sa_data;
if ( u[0]+ u[1]+
u[2]+ u[3]+ u[4]+
u[5])
{
printf("HW Address: %2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x\n",
u[0], u[1], u[2],
u[3], u[4], u[5]);
}
}
printf("\n"
);
} /* end of for */
close( sockfd);
free(ifc.ifc_req);
return(
EXIT_SUCCESS );
}
输入网路接口名获取MAC地址
Interface: lo Interface: eth0
|