当前位置:编程学习 > asp >>

没有最DT只有更DT [NET类分享]

有个问题困扰了好久了,如何处理网站访问者的身份呢?IP吗?如果用户改IP呢?后来想到了用户电脑的MAC地址是唯一的,OK想办法拿到用户MAC地址问题就解决了。但是怎么拿又是个问题,全网上查 了下,发现一个拿自己MAC的方法,但是不是我们要的结果啊,肿么办?DT的问了老师,他说PHP不能获取到MAC地址,当时好伤心啊。后来想想或许大神是真不知道吧。但是,关荣的遇上了强哥(李强强老师),强哥V5啊!在强哥的课堂是一不小心学到了一个关于操作MAC的函数,太happy了,灵感来了!arp -a (linux上是直接用arp 就行) 只要用户登录你的网站就会建立通信,然后他的MAC就存到你的arp列表中。在php上使用exec()函数可以执行DOS命令,然后把exec()执行的结果赋值给一个数组,下图是在DOS上的结果
----------------------------------------------------------------------------------
C:\Documents and Settings\Administrator>arp -a

Interface: 192.168.100.254 --- 0x2
  Internet Address      Physical Address      Type
  192.168.100.137       00-00-00-00-00-00     invalid

Interface: 192.168.60.29 --- 0x3
  Internet Address      Physical Address      Type
  192.168.60.1          3c-e5-a6-0c-60-bb     dynamic
  192.168.60.4          00-1f-c6-e9-4c-a3     dynamic
  192.168.60.13         00-16-d3-2f-83-55     dynamic
  192.168.60.28         00-15-58-7b-72-92     dynamic
  192.168.60.100        dc-0e-a1-5f-57-a6     dynamic
  192.168.60.179        00-15-58-81-07-4e     dynamic
  192.168.60.214        00-16-41-17-f0-d1     dynamic
----------------------------------------------------------------------------------
得到这个数组后我们就可以拿到用户的mac了,这里会用到一些字符串处理函数,推荐大家使用explode(),很快就拿到自己想要的数据了,是不是很happy。
在笔者测试的时候也发现了一些问题,需要继续完善下,这个命令在windows环境下跑的很好,但到linux下就捉襟见肘了,不过这里大体思路完成了,只要在用户访问网站时,先判断下用户的操作系统然后对应的选择NET类中的方法就解决问题了,话说linux下用awk会比php的字符串操作函数更方便,期待大家共同完善,和提出新的问题,共同进步!
下面附上源码。
<!--Net.class.php-->
<?php
/**
*采集访问者网络信息
*
*/
class Net{
/**
*参数列表
*    www.zzzyk.com
*@param string $hostMac     服务器IP配置文件的MAC信息行
*@param string $Vip         客户端IP地址
*@param string $Vmac         客户端MAC地址
*
*/

    private $hostMac=array();
    static $Vip=NULL;
    private $pos;
    static $Vmac=NULL;   
    private $Maclist=array();   

    /**
    *获取服务器的MAC地址
    *@param int $Tmpa             支持for循环的临时参数
    *@param array $Tmarr             存放列表信息的临时数组
    *@return  返回值:服务器的MAC
    */
    public function getHostMac(){
        @exec("ipconfig/all",$Tmarr);
        for($Tmpa;$Tmpa<count($Tmarr);$Tmpa++){
            if(eregi("Physical",$Tmarr[$Tmpa])){
                $this->hostMac=explode(":",$Tmarr[$Tmpa]);   
            }
        }
        return $this->hostMac[1];   
    }

    /**
    *获取客户端的IP地址
    *@param int $Tmpa             支持for循环的临时参数
    *@param array $Tmarr             存放列表信息的临时数组       
    *@return 返回值:客户端IP
    */
    public function getVisitIp() {
        if (self::$Vip !== NULL){
            return self::$Vip;
            }
        if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])){
            $Tmarr = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
            $pos = array_search('unknown',$Tmarr);
            if(false !== $pos){
                unset($Tmarr[$pos]);
            }
            echo self::$Vip;
            die();
        }elseif (isset($_SERVER['HTTP_CLIENT_IP'])) {
            self::$Vip = $_SERVER['HTTP_CLIENT_IP'];
        }elseif (isset($_SERVER['REMOTE_ADDR'])) {
            self::$Vip = $_SERVER['REMOTE_ADDR'];
        }
        // IP地址合法验证
        self::$Vip = (false !== ip2long(self::$Vip)) ? self::$Vip : '0.0.0.0';
        return self::$Vip;
    }

    /**
    *获取客户端的MAC地址
    *
    *@param int $Tmpa             支持for循环的临时参数
    *@param array $Tmarr             存放列表信息的临时数组   
    *@return 返回值:客户端MAC
    */
    public function getVisitMac(){
        @exec("arp -a",$Tmarr);
        $ip=$this->getVisitIp();
        for($Tmpa;$Tmpa<count($Tmarr);$Tmpa++){
            if(eregi($ip,$Tmarr[$Tmpa])){
                self::$Vmac=explode(" ",$Tmar

补充:Web开发 , ASP.Net ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,