- //方法一
- 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()
- {
- @exec("ipconfig /all", $this->return_array);
- if ( $this->return_array )
- return $this->return_array;
- else{
- $ipconfig = $_server["windir"]."system32ipconfig.exe";
- if ( is_file($ipconfig) )
- @exec($ipconfig." /all", $this->return_array);
- else
- @exec($_server["windir"]."systemipconfig.exe /all", $this->return_array);
- return $this->return_array;
- }
- }
- function forlinux()
- {
- @exec("ifconfig -a", $this->return_array);
- return $this->return_array;
- }
- }
- ?>
- <?
- $mac = new getmacaddr(php_os);
- echo $mac->mac_addr;
- //方法二
- 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;//开源代码Vevb.com
- }
新闻热点
疑难解答