PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: Simple Network
EuGen Администратор
Отправлено: 12 Мая, 2011 - 09:58:46
Post Id


Профессионал


Покинул форум
Сообщений всего: 9097
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Представляю Вашему вниманию простой класс для работы с сетью. Класс предоставляет базовые методы по обработке и поиску адресов.
PHP:
скопировать код в буфер обмена
  1.  
  2. class Network_Simple
  3. {
  4.     protected $sCurrentIP;    
  5.     protected $rgLocalSubnets=array(
  6.         array('net'=>'10.0.0.0',    'mask'=>8),
  7.         array('net'=>'192.168.0.0', 'mask'=>16)
  8.     );
  9.  
  10.     function __construct($sCurrentIp=null)
  11.     {
  12.         $this->sCurrentIp=$sCurrentIp?$sCurrentIp:$_SERVER['REMOTE_ADDR'];
  13.     }
  14.     /**
  15.      * Useful for DHCP purposes. Returns first free IP in specified subnet
  16.      * @param array $rgIPs List of busy IP
  17.      * @param array $rgSubnet Subnet presentation. Must contain keys 'net' and 'mask'
  18.      * @return mixed
  19.      */
  20.     public function leaseAddressDHCP($rgIPs, $rgSubnet)
  21.     {
  22.        $rgLongs=array_map(create_function('$ip', 'return sprintf("%u", ip2long($ip));'), $rgIPs);
  23.        $rgSubnets=range(sprintf("%u", ip2long($rgSubnet['net']))+1, sprintf("%u", ip2long($rgSubnet['net']))+pow(2,32-$rgSubnet['mask'])-1);
  24.        $rgResult=array_diff($rgSubnets, $rgLongs);
  25.        if(!count($rgResult))
  26.        {
  27.           return null;
  28.        }
  29.        return long2ip(array_shift($rgResult));
  30.     }
  31.     /**
  32.      * Returns full table of free IP addresses in $rgSubnet
  33.      * @param array $rgIPs List of busy IP
  34.      * @param array $rgSubnet Subnet presentation. Must contain keys 'net' and 'mask'
  35.      * @return mixed
  36.      */
  37.     public function leaseTableDHCP($rgIPs, $rgSubnet)
  38.     {
  39.        $rgLongs=array_map(create_function('$ip', 'return sprintf("%u", ip2long($ip));'), $rgIPs);
  40.        $rgSubnets=range(sprintf("%u", ip2long($rgSubnet['net']))+1, sprintf("%u", ip2long($rgSubnet['net']))+pow(2,32-$rgSubnet['mask'])-1);
  41.        $rgResult=array_diff($rgSubnets, $rgLongs);
  42.        $rgResult=array_map(create_function('$ip', 'return long2ip($ip);'), $rgResult);
  43.        if(!count($rgResult))
  44.        {
  45.           return null;
  46.        }
  47.        return $rgResult;
  48.     }
  49.     /**
  50.      * Returns MAC-address (Ethernet 2-level in OSI model address)
  51.      * @param string $ip Address to search MAC for. If not set, IP-address from constructor'll be used
  52.      * @return mixed
  53.      */
  54.     public function getMAC($ip=null)
  55.     {
  56.         if((!$ip && !$this->sCurrentIP) || !$this->_arp_allowed())
  57.         {
  58.             return null;
  59.         }
  60.         $ip=$ip?$ip:$this->sCurrentIP;
  61.         $rgMatches=array();
  62.         if(PHP_OS=='WINNT')
  63.         {
  64.            exec("arp -a", $rgResult);
  65.            $sMacTemplate="/[\d|A-F]{2}\-[\d|A-F]{2}\-[\d|A-F]{2}\-[\d|A-F]{2}\-[\d|A-F]{2}\-[\d|A-F]{2}/i";
  66.            foreach($rgResult as $key=>$value)
  67.            {
  68.               if (strpos($value, $ip)!==FALSE)
  69.               {
  70.                  preg_match($sMacTemplate, $value, $rgMatches);
  71.                  break;
  72.               }
  73.            };
  74.         }
  75.         else
  76.         {
  77.            exec("arp -a | grep $ip", $rgResult);
  78.            if(count($rgResult))
  79.            {
  80.                $sMacTemplate="/[\d|A-F]{2}\:[\d|A-F]{2}\:[\d|A-F]{2}\:[\d|A-F]{2}\:[\d|A-F]{2}\:[\d|A-F]{2}/i";
  81.                preg_match($sMacTemplate, $rgResult[0], $rgMatches);
  82.            }
  83.         }
  84.         return count($rgMatches)?$rgMatches[0]:null;
  85.     }
  86.     /**
  87.      * Get client remote IP address
  88.      * @param boolean $bReturnLocalIP If set to true, local subnet address'll be returned (if present)
  89.      * @return string
  90.      */
  91.     public function getRemoteIP($bReturnLocalIP=false)
  92.     {
  93.         if($_SERVER['HTTP_X_FORWARDED_FOR'])
  94.         {
  95.             $rgIPs=preg_split('/\s+/s', $_SERVER['HTTP_X_FORWARDED_FOR'], -1, PREG_SPLIT_NO_EMPTY);
  96.             foreach($rgIPs as $ip)
  97.             {
  98.                 if($bReturnLocalIP)
  99.                 {
  100.                     return $ip;
  101.                 }
  102.                 else
  103.                 {
  104.                     $bIsLocal=false;
  105.                     foreach($this->rgLocalSubnets as $rgSubnet)
  106.                     {
  107.                         if($this->isInSubnet($rgSubnet, $ip))
  108.                         {
  109.                             $bIsLocal=true;
  110.                         }
  111.                     }
  112.                     if(!$bIsLocal)
  113.                     {
  114.                         return $ip;
  115.                     }
  116.                 }
  117.             }
  118.         }
  119.         return $_SERVER['REMOTE_ADDR'];
  120.     }
  121.     /**
  122.      *
  123.      * @param array $rgSubnet Subnet presentation. Must contain keys 'net' and 'mask'
  124.      * @param string $ip IP address to compare with subnet
  125.      * @return boolean
  126.      */
  127.     public function isInSubnet($rgSubnet, $ip=null)
  128.     {
  129.         if((!$ip && !$this->_current_ip)|| !is_array($rgSubnet))
  130.         {
  131.             return false;
  132.         }
  133.         $ip=$ip?$ip:$this->_current_ip;
  134.         if(!preg_match('/^[\d]+$/', $rgSubnet['mask']))
  135.         {
  136.             $rgSubnet['mask']=(int)log(($this->ip2Long('255.255.255.255')-$this->ip2Long($rgSubnet['mask'])),2);
  137.         }
  138.         else
  139.         {
  140.             $rgSubnet['mask']=(int)$rgSubnet['mask'];
  141.         }
  142.         if($rgSubnet['mask']===0)
  143.         {
  144.             return true;
  145.         }
  146.         $binIP    = sprintf("%032b",$this->ip2Long($ip));
  147.         $binNet   = sprintf("%032b",$this->ip2Long($rgSubnet['net']));
  148.         return (substr_compare($binIP,$binNet,0,$rgSubnet['mask']) === 0);
  149.     }
  150.     /**
  151.      *
  152.      * @param string $sFrom starting IP in range
  153.      * @param string $sTill ending IP in range
  154.      * @param string $ip optional ip for check
  155.      * @return boolean
  156.      */
  157.     public function isInRange($sFrom, $sTill, $ip=null)
  158.     {
  159.         if((!$ip && !$this->_current_ip))
  160.         {
  161.             return false;
  162.         }
  163.         $ip=$ip?$ip:$this->_current_ip;
  164.         return $this->ip2Long($sFrom)<=ip2long($ip)&&$this->ip2Long($sTill)>=ip2long($ip);
  165.     }
  166.     /**
  167.      *
  168.      * @param string $sHost remote host to be checked
  169.      * @param string $ip optional ip for check
  170.      * @return boolean
  171.      */
  172.     public function isInHost($sHost, $ip=null)
  173.     {
  174.         if((!$ip && !$this->_current_ip))
  175.         {
  176.             return false;
  177.         }
  178.         $ip=$ip?$ip:$this->_current_ip;
  179.         if($_SERVER['REMOTE_HOST']==$sHost)
  180.         {
  181.             return true;
  182.         }
  183.         return false;
  184.     }
  185.     /**
  186.      * Check if IP is in wild-range of IP and/or subnets/ranges
  187.      * @param array $rgList an array of string representation for checks. .htaccess format is supported
  188.      * @param string $ip optional ip for check
  189.      * @return boolean
  190.      */
  191.     public function isInList($rgList, $ip=null)
  192.     {
  193.         if((!$ip && !$this->_current_ip))
  194.         {
  195.             return false;
  196.         }
  197.         $ip=$ip?$ip:$this->_current_ip;
  198.         foreach($rgList as $mData)
  199.         {
  200.             //subnet:
  201.             if(preg_match('/^(\d+\.\d+\.\d+\.\d+)\/(.*?)$/', $mData))
  202.             {
  203.                 $rgFilter           = explode('/', $mData);
  204.                 $rgFilter['net']    = $rgFilter[0];
  205.                 $rgFilter['mask']   = $rgFilter[1];
  206.                 if($this->isInSubnet($rgFilter))
  207.                 {
  208.                     return true;
  209.                 }
  210.             }
  211.             //range
  212.             if(preg_match('/^(\d+\.\d+\.\d+\.\d+)\-(\d+\.\d+\.\d+\.\d+)$/', $mData))
  213.             {
  214.                 $rgFilter           = explode('-', $mData);
  215.                 if($this->isInRange($rgFilter[0], $rgFilter[1]))
  216.                 {
  217.                     return true;
  218.                 }
  219.             }
  220.             //address?
  221.             if($ip==$mData)
  222.             {
  223.                 return true;
  224.             }
  225.             //dns?
  226.             if($this->isInHost($mData))
  227.             {
  228.                 return true;
  229.             }
  230.         }
  231.         return false;
  232.     }
  233.     /**
  234.      *
  235.      * @param string $ip Address to convert. If not set, IP-address from constructor'll be used
  236.      * @return mixed
  237.      */
  238.     public function ip2Long($ip=null)
  239.     {
  240.         //lazy:
  241.         if(!$ip && !$this->sCurrentIP)
  242.         {
  243.             return null;
  244.         }
  245.         $ip=$ip?$ip:$this->sCurrentIP;
  246.         return sprintf("%u", ip2long($ip));
  247.     }
  248.     //arp may be unreachable due to system security; we still rely on 'which' command
  249.     protected function _arp_allowed()
  250.     {
  251.         if(PHP_OS=='WINNT')
  252.         {
  253.             return true;
  254.         }
  255.         $rgResult=array();
  256.         exec("which arp 2>&1", $rgResult);
  257.         if(!count($rgResult))
  258.         {
  259.             return false;
  260.         }
  261.         return !preg_match('/no arp/i',$rgResult[0]);
  262.     }
  263.    
  264. }
  265.  

Как пример использования:
PHP:
скопировать код в буфер обмена
  1.  
  2. $rgSubnet=array('net'=>'86.45.68.22', 'mask'=>30);
  3. $rNet=new Network_Simple();
  4. $sIP=$rNet->getRemoteIP();
  5. if($rNet->isInSubnet($rgSubnet, $sIP))
  6. {
  7.    echo($sIP." был определен как принадлежащий подсети");
  8. }
  9. if($rNet->isInSubnet($rgSubnet))
  10. {
  11.    echo($_SERVER['REMOTE_ADDR']." был определен как принадлежащий подсети");
  12. }
  13. $sMAC=$rNet->getMAC();
  14. //операции с MAC-адресом
  15.  


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 1 (гостей: 1, зарегистрированных: 0)
« Пользовательские функции »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB