?? getkey.h
字號:
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cassert>
#include <unistd.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <net/if.h>
#include <net/if_arp.h>
class LGIM { // LinuxGetIpMac
public:
LGIM()
{
_sock = socket( AF_INET, SOCK_DGRAM, 0 );
assert( _sock != -1 );
}
~LGIM()
{
close( _sock );
}
void GetIpMac( void )
{
bzero( &_ifc, sizeof(_ifc) );
// first, you must get number of net device which you have
// ioctl(SIOCGIFCONF) with zero(ifc) will return the length
int ret = ioctl( _sock, SIOCGIFCONF, &_ifc, sizeof(_ifc) );
assert( !ret );
// must alloc memory yourself
_ifc.ifc_buf = (char *)malloc( _ifc.ifc_len );
bzero( _ifc.ifc_buf, _ifc.ifc_len );
ret = ioctl( _sock, SIOCGIFCONF, &_ifc, sizeof(_ifc) ); // get ifr_name
assert( !ret );
int n = _ifc.ifc_len / sizeof(struct ifreq);//you have n net devices
struct ifreq *pifr = (struct ifreq *)_ifc.ifc_buf;
for ( int i = 0; i < n; ++i, ++pifr ) {
CheckDevice( pifr );
}
free( _ifc.ifc_buf );
}
char mackey[9];
private:
void Print()
{
/* printf( "%s\tmac addr: %02x:%02x:%02x:%02x:%02x:%02x\n", _device.name, _device.mac[0], _device.mac[1], _device.mac[2], _device.mac[3], _device.mac[4], _device.mac[5] );
printf( "\tip addr: %lu.%lu.%lu.%lu\n", _device.ip&0xff, (_device.ip&0xff00)>>8, (_device.ip&0xff0000)>>16, _device.ip>>24 );
printf( "\tnet mask: %lu.%lu.%lu.%lu\n\n", _device.netmask&0xff, (_device.netmask&0xff00)>>8, (_device.netmask&0xff0000)>>16, _device.netmask>>24 );
*/
sprintf(mackey,"%02x%02x%02x%02x",_device.mac[0],_device.mac[1],_device.mac[2],_device.mac[3]);
}
void LGIM::CheckDevice( const struct ifreq *pifr )
{
if ( pifr->ifr_addr.sa_family != PF_INET ) return; // not tcp/ip
// memcpy( &_device.ip, pifr->ifr_ifaddr.sa_data, 4 ); // copy ip addr
// but i want to show you get ip address through ioctl( SIOCGIFADDR )
bzero( &_device, sizeof(_device) );
bzero( &_ifr, sizeof(_ifr) );
strcpy( _ifr.ifr_name, pifr->ifr_name );
// get hardware address( for ethernet: mac address )
int ret = ioctl( _sock, SIOCGIFHWADDR, &_ifr, sizeof(_ifr) );
assert( !ret );
if ( _ifr.ifr_hwaddr.sa_family != ARPHRD_ETHER ) return; // not ethernet
memcpy( _device.mac, _ifr.ifr_hwaddr.sa_data, 6 );
// get ip address
ret = ioctl( _sock, SIOCGIFADDR, &_ifr, sizeof(_ifr) );
assert( !ret );
memcpy( &_device.ip, _ifr.ifr_addr.sa_data, 4 );
_device.ip = ((struct sockaddr_in *)(&_ifr.ifr_addr))->sin_addr.s_addr;
// get ip sub-net mask
ret = ioctl( _sock, SIOCGIFNETMASK, &_ifr, sizeof(_ifr) );
assert( !ret );
_device.netmask = ((struct sockaddr_in *)(&_ifr.ifr_netmask))->sin_addr.s_addr;
// copy devie name
strncpy( _device.name, _ifr.ifr_name, sizeof(_device.name)-1 );
Print();
}
private:
int _sock;
struct ifreq _ifr;
struct ifconf _ifc;
struct {
unsigned long ip;
unsigned long netmask;
unsigned char mac[6];
char name[10];
} _device;
};
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -