代码如下 | 复制代码 |
class getmacaddr { var $return_array = array(); // 返回带有mac地址的字串数组 var $mac_addr; function getmacaddr($os_type) { switch ( strtolower($os_type) ) { case "linux": $this->forlinux(); break; case "solaris": break; case "unix": break; case "aix": break; default: $this->forwindows(); break; } $temp_array = array(); foreach ( $this->return_array as $value ) { if ( preg_match( "/[0-9a-f][0-9a-f][:-]"."[0-9a-f][0-9a-f][:-]"."[0-9a-f][0-9a-f][:-]"."[0-9a-f][0-9a-f][:-]"."[0-9a-f][0-9a-f][:-]"."[0-9a-f][0-9a-f]/i", $value, $temp_array ) ) { $this->mac_addr = $temp_array[0]; break; } } unset($temp_array); return $this->mac_addr; } function forwindows() function forlinux() |
//方法二
代码如下 | 复制代码 |
qstring getlocalmac() { int sock_mac; struct ifreq ifr_mac; char mac_addr[30]; sock_mac = socket( af_inet, sock_stream, 0 ); if( sock_mac == -1) { perror("create socket falise...mac "); return ""; } memset(&ifr_mac,0,sizeof(ifr_mac)); strncpy(ifr_mac.ifr_name, "eth0", sizeof(ifr_mac.ifr_name)-1); if( (ioctl( sock_mac, siocgifhwaddr, &ifr_mac)) < 0) { printf("mac ioctl error "); return ""; } sprintf(mac_addr,"%02x%02x%02x%02x%02x%02x", (unsigned char)ifr_mac.ifr_hwaddr.sa_data[0], (unsigned char)ifr_mac.ifr_hwaddr.sa_data[1], (unsigned char)ifr_mac.ifr_hwaddr.sa_data[2], (unsigned char)ifr_mac.ifr_hwaddr.sa_data[3], (unsigned char)ifr_mac.ifr_hwaddr.sa_data[4], (unsigned char)ifr_mac.ifr_hwaddr.sa_data[5]); printf("local mac:%s ",mac_addr); close( sock_mac ); return qstring( mac_addr ); } |
//用c实现的
代码如下 | 复制代码 |
int getalllocaladaptermacaddr(std::list<std::vector<unsigned char> >& mac) { ncb ncb; lana_enum adapterlist;
memset(&ncb, 0, sizeof(ncb)); ncb.ncb_command = ncbenum; ncb.ncb_buffer = (unsigned char *)&adapterlist; ncb.ncb_length = sizeof(adapterlist); netbios(&ncb);
mac.resize(0);
for (int i = 0; i < adapterlist.length ; ++i ) { struct astat { adapter_status adapt; name_buffer ps教程z_name[30]; } adapter;
// reset the lan adapter so that we can begin querying it ncb ncb; memset( &ncb, 0, sizeof (ncb)); ncb.ncb_command = ncbreset; ncb.ncb_lana_num = adapterlist.lana[i];
if (netbios(&ncb) != nrc_goodret) continue;
// prepare to get the adapter status block memset(&ncb, 0, sizeof(ncb)) ; ncb.ncb_command = ncbastat; ncb.ncb_lana_num = adapterlist.lana[ i ]; strcpy((char *)ncb.ncb_callname, "*" );
memset(&adapter, 0, sizeof (adapter)); ncb.ncb_buffer = (unsigned char *)&adapter; ncb.ncb_length = sizeof (adapter);
// get the adapter's info and, if this works, return it in standard, // colon-delimited form. if ( netbios( &ncb ) == 0 ) { std::vector<unsigned char> v6; v6.resize(6); for (int i=0; i<6; i++) v6[i] = adapter.adapt.adapter_address[i]; if (v6[0] == 0) { std::list<std::vector<unsigned char> >::iterator i = mac.begin(); for (; i!=mac.end(); i++) if (*i == v6) break; if (i==mac.end()) mac.push_back(v6); } } else break; } return 0; } |