#include "stdio.h" #include "string.h" #include "net/if.h" #include "sys/ioctl.h" // // Global public data // unsigned char cMacAddr[8]; // Server's MAC address static int GetSvrMacAddress( char *pIface ) { int nSD; // Socket descriptor struct ifreq sIfReq; // Interface request struct if_nameindex *pIfList; // Ptr to interface name index struct if_nameindex *pListSave; // Ptr to interface name index // // Initialize this function // pIfList = (struct if_nameindex *)NULL; pListSave = (struct if_nameindex *)NULL; #ifndef SIOCGIFADDR // The kernel does not support the required ioctls return( 0 ); #endif // // Create a socket that we can use for all of our ioctls // nSD = socket( PF_INET, SOCK_STREAM, 0 ); if ( nSD < 0 ) { // Socket creation failed, this is a fatal error printf( "File %s: line %d: Socket failed\n", __FILE__, __LINE__ ); return( 0 ); } // // Obtain a list of dynamically allocated structures // pIfList = pListSave = if_nameindex(); // // Walk thru the array returned and query for each interface's // address // for ( pIfList; *(char *)pIfList != 0; pIfList++ ) { // // Determine if we are processing the interface that we // are interested in // if ( strcmp(pIfList->if_name, pIface) ) // Nope, check the next one in the list continue; strncpy( sIfReq.ifr_name, pIfList->if_name, IF_NAMESIZE ); // // Get the MAC address for this interface // if ( ioctl(nSD, SIOCGIFHWADDR, &sIfReq) != 0 ) { // We failed to get the MAC address for the interface printf( "File %s: line %d: Ioctl failed\n", __FILE__, __LINE__ ); return( 0 ); } memmove( (void *)&cMacAddr[0], (void *)&sIfReq.ifr_ifru.ifru_hwaddr.sa_data[0], 6 ); break; } // // Clean up things and return // if_freenameindex( pListSave ); close( nSD ); return( 1 ); } int main( int argc, char * argv[] ) { // // Initialize this program // bzero( (void *)&cMacAddr[0], sizeof(cMacAddr) ); if ( !GetSvrMacAddress("eth0") ) { // We failed to get the local host's MAC address printf( "Fatal error: Failed to get local host's MAC address\n" ); } printf( "HWaddr %02X:%02X:%02X:%02X:%02X:%02X\n", cMacAddr[0], cMacAddr[1], cMacAddr[2], cMacAddr[3], cMacAddr[4], cMacAddr[5] ); // // And exit // exit( 0 ); }[링크 : http://www.linuxquestions.org/questions/programming-9/getting-mac-address-with-c-linux-325037/]
위의 소스 작동하는 것 확인함.
아무튼, struct ifreq 에 ioctl함수로 받아오는 식으로 구현되어 있음.
man 7 netdevice
struct ifreq { char ifr_name[IFNAMSIZ]; /* Interface name */ union { struct sockaddr ifr_addr; struct sockaddr ifr_dstaddr; struct sockaddr ifr_broadaddr; struct sockaddr ifr_netmask; struct sockaddr ifr_hwaddr; short ifr_flags; int ifr_ifindex; int ifr_metric; int ifr_mtu; struct ifmap ifr_map; char ifr_slave[IFNAMSIZ]; char ifr_newname[IFNAMSIZ]; char * ifr_data; }; }; [링크 : http://unixhelp.ed.ac.uk/CGI/man-cgi?netdevice+7] |
$ vi /usr/inclue/bits/socket.h 161 /* Structure describing a generic socket address. */ 162 struct sockaddr 163 { 164 __SOCKADDR_COMMON (sa_); /* Common data: address family and length. */ 165 char sa_data[14]; /* Address data. */ 166 }; |
[링크 : http://adywicaksono.wordpress.com/2007/11/08/detecting-mac-address-using-c-application/]
[링크 : http://www.joinc.co.kr/modules/moniwiki/wiki.php/Code/C/ifinfo]
'Linux API > network' 카테고리의 다른 글
gateway 정보 (0) | 2009.06.05 |
---|---|
linux에서 ip/mac address 받아오기 관련 링크 (0) | 2009.06.05 |
network 관련 include 할 파일 목록 (0) | 2009.06.05 |
offsetof() - stddef.h (0) | 2009.06.05 |
SIOCGIF가 모야? (0) | 2009.06.05 |