php计算网段内所有IP,分配子网段

由于最近业务需要,写了个获取网段内所有IP的函数,以及分配可用子网段的函数

/**
 * 根据网段获取计算所有IP
 * @param string $segment 网段 ‘139.217.0.1/24‘
 * @return array IP列表 [‘139.217.0.1‘,‘139.217.0.2‘……]
 */
function getIpBySegment($segment)
{
    $segmentInfo = explode("/", $segment);//[‘139.217.0.1‘,24]
    $beginIpArray = explode(".", $segmentInfo[0]);//[139,217,0,1]
    $mask = intval($segmentInfo[‘1‘]);//24
    $endIp = array();
    foreach ($beginIpArray as $ipKey => $item) {
        $beginFlag = 8 * ($ipKey);//0   8   16  24
        $endFlag = 8 * ($ipKey + 1);//8   16  24  32
        $decbinItem = str_pad(decbin($item), 8, "0", STR_PAD_LEFT);
        $endIp[] = $mask >= $endFlag ? $item : ($mask > $beginFlag ? bindec(str_pad(substr($decbinItem, 0, $mask - $beginFlag), 8, "1", STR_PAD_RIGHT)) : ($ipKey <= 2 ? pow(2, 8) - 1 : pow(2, 8) - 1));
    }
    $ipArray = array();
    for ($beginIp[0] = $beginIpArray[0]; $beginIp[0] <= $endIp[0]; $beginIp[0]++) {
        for ($beginIp[1] = $beginIpArray[1]; $beginIp[1] <= $endIp[1]; $beginIp[1]++) {
            for ($beginIp[2] = $beginIpArray[2]; $beginIp[2] <= $endIp[2]; $beginIp[2]++) {
                for ($beginIp[3] = $beginIpArray[3]; $beginIp[3] <= $endIp[3]; $beginIp[3]++) {
                    $ipArray[] = implode(".", $beginIp);
                }
            }
        }
    }
    return $ipArray;
}
/**
 * 在指定网段中分配子网段
 * @param string $segment 指定网段
 * @param int $ipNum 需要的IP数
 * @param array $usedIpArray 不可用(已经使用)的IP,默认为空数组
 * @return bool|string 成功则返回分配的网段
 */
function allocateSegment($segment, $ipNum, $usedIpArray = [])
{
    $usedIpArray = empty($usedIpArray) ? [] : array_flip($usedIpArray);
    //计算需要多少个IP
    $i = 0;
    $ipCount = pow(2, $i);
    while ($ipCount < $ipNum) {
        $i++;
        $ipCount = pow(2, $i);
    }
    $newMask = 32 - $i;
    //大网段的开始和结束IP
    $segmentInfo = explode("/", $segment);//[‘139.217.0.1‘,24]
    $beginIpArray = explode(".", $segmentInfo[0]);//[139,217,0,1]
    $mask = intval($segmentInfo[‘1‘]);//24
    if ($newMask < $mask) {
        return false;
    }
    $endIp = array();
    $step = [];
    foreach ($beginIpArray as $ipKey => $item) {
        $beginFlag = 8 * ($ipKey);//0   8   16  24
        $endFlag = 8 * ($ipKey + 1);//8   16  24  32
        $step[$ipKey] = $newMask > $endFlag ? 1 : ($endFlag - $newMask < 8 ? pow(2, $endFlag - $newMask) : pow(2, 8));
        $decbinItem = str_pad(decbin($item), 8, "0", STR_PAD_LEFT);
        $endIp[] = $mask >= $endFlag ? $item : ($mask > $beginFlag ? bindec(str_pad(substr($decbinItem, 0, $mask - $beginFlag), 8, "1", STR_PAD_RIGHT)) : ($ipKey <= 2 ? pow(2, 8) - 1 : pow(2, 8) - 1));
    }
    //遍历生成网段
    for ($beginIp[0] = $beginIpArray[0]; $beginIp[0] <= $endIp[0]; $beginIp[0] += $step[0]) {
        for ($beginIp[1] = $beginIpArray[1]; $beginIp[1] <= $endIp[1]; $beginIp[1] += $step[1]) {
            for ($beginIp[2] = $beginIpArray[2]; $beginIp[2] <= $endIp[2]; $beginIp[2] += $step[2]) {
                for ($beginIp[3] = $beginIpArray[3]; $beginIp[3] <= $endIp[3]; $beginIp[3] += $step[3]) {
                    $newSegment = implode(‘.‘, $beginIp) . ‘/‘ . $newMask;
                    //获取该网段所有的IP
                    $ipArray = getIpBySegment($newSegment);
                    $canUse = true;
                    //判断该网段是否可用
                    if (!empty($usedIpArray)) {
                        foreach ($ipArray as $ip) {
                            if (isset($usedIpArray[$ip])) {
                                $canUse = false;
                                break;
                            }
                        }
                    }
                    if ($canUse) {
                        return $newSegment;
                    }
                }
            }
        }
    }
    return false;
}

原文地址:https://www.cnblogs.com/liaokaichang/p/8485202.html

时间: 2024-11-08 20:34:44

php计算网段内所有IP,分配子网段的相关文章

Python: ping网段内所有ip并返回结果

今天用Python写了一段小代码,实现的功能是ping某一个网段的所有ip,然后将ping的结果提取出来,输出可以ping通的ip以及往返时间. 初学Python,写得简陋,各位大侠多多指教. 正则表达式请根据自己的系统进行调整,我这个是中文win7下的结果 Python3.3下测试没问题 ping测试的过程中内存占用较大,不知道可以怎么改进 __author__ = 'wucl' import subprocess, re, _thread, queue, time, threading pr

IP分配及网段划分

IP我们先来了解一下3类常用的IP A类IP段 0.0.0.0 到127.255.255.255  B类IP段 128.0.0.0 到191.255.255.255  C类IP段 192.0.0.0 到223.255.255.255 计算可用IP个数?将子网掩码转换成二进制,进行计算,如下: 255.0.0.0 11111111.00000000.00000000.00000000 255.255.0.0 11111111.11111111.00000000.00000000 255.255.2

shell 检查网段内的IP使用情况,并进行统计

#!/bin/bash # 北京Linux技术交流群:76109360 n=0 s=0 for(( i=1; i <= 10; i++ )) do     if ping -c 1 -W 1 192.168.1.$i > /dev/null; then         echo -e "\033[31m192.168.1.$i yes\033[0m"         let n=$n+1     else         echo -e "\033[32m192.

FW Docker为容器分配指定物理网段的静态IP

官方有关于网桥和IP配置的文档地址:https://docs.docker.com/articles/networking/ 1.宿主机(系统采用ubuntu-14.04.1-server-amd64)的网络采用桥接模式(默认是DHCP模式,还有一种模式就是静态IP),网桥的网段与物理网段相同.目前的物理网段为192.168.5.1/24,网关是192.168.1.1,物理网卡设备为eth0编辑配置文件/etc/network/interfaces,自定义网桥br0 [email protect

外网IP地址 内网 IP

外网IP地址 大部分网络使用B类或C类地址,每一个类的第一个八位组的范围如下: 1.0-—127.A类 网络号码范围是 0.0.0.0---127.0.0.0 ,用于128个网络.但网络不能全由0组成且127.0.0.0保留用于回路.剩下的126个网络,1到126,共有16777214个可能的主机地址(16777216减2) A类 网络 —主机—主机—主机 0-127 127 0 0 0 2.128—191.B类,网络号码范围是128.0.0.0--191.254.0.0 用于16256个网络.

Linux下搭建Oracle11g RAC(1)----IP分配与配置IP

首先需要说明的,我的RAC搭建不是在虚拟机上完成的,而是在实际部署中,二者之间有些许差异,本人水平有限,请见谅. 其中,每台机器至少需要配置3个IP地址,在安装操作系统的过程中,我们需要配置公网IP和私有IP即可,虚拟IP在安装集群件时分配. Public IP.Virtual IP.SCAN IP必须配置在同一网段. private IP与他们不能在同一网段内. SCAN IP是Oracle 11g新推出的,在配置11g RAC时需要指定. Hostname Short Hostname Ty

关于网络中的内网IP地址和公网IP地址

公网IP和内网IP    一.先来看一下IP地址划分: A类地址:0.0.0.0------127.255.255.255 其中127.255.255.255是广播地址,不能分配 B类地址:128.0.0.0------191.255.255.255 C类地址:192.0.0.0------223.255.255.255 D类地址:224.0.0.0-----239.255.255.255 E类地址:240.0.0.0------255.255.255         你要是想看你自己机子的IP

外网IP和内网IP的区别

这两天遇到一个bug,折腾的够呛,已经上线的项目,出现了个人登录不上的情况,瞬间整个人都不好了,首先找问题,在本地和测试服务器上都没问题,打包发布到正式环境就出现问题了,刚开始我看不了日志,日志要找别人要,自己各种方法折腾,后来要到日志,看了半天,突然发现后台报错连接超时,这是什么鬼?本地.测试都没问题,正式环境报这个问题,幸好同事之前经历过同样的事情,我说连接超时,他有点印象,原来是Linux服务器不能二次通过外网访问自己,要换成内网IP,然后就解决了问题,困扰了一天半,有感之余学习下外网IP

彻查网络局部网段内Ping时断时续的问题

前两天须要安装2台server,结果前期一直有问题的网络又来了,明明vlan内能ping通,可是与vlan外却ping不同. 这个现象非常像是arp病毒,于是周末的时间我们就进行了一次彻底的排查,一定要找出问题的根源.鉴于这个网络问题跟硬件的关系也非常大,我们还专门请来了网络设备供应商的网络技术project师. 为了降低干扰,将本来执行的上网行为软件关闭,以免因为软件管控影响兴许的推断. 通过把本网段内的计算机逐个关闭或者断网.最后仅仅保留后安装的一台server,这时再ping的时候仍然有问