查找可用的IP到主机端口

时间:2016-09-13 22:11:02

标签: php tcp

我很头疼,试图弄清楚如何在列表中找到可用端口的IP地址。 我的问题实际上非常简单,但我无法弄清楚如何编程。 我跳了一个人可以指出我正确的方向。 也许有一种方法可以优化列表,以便更容易在其中进行搜索。

这是我的问题。 我有一个IP列表和每个客户端拥有的多个端口。 我可以在同一个IP上拥有多个客户端,但我无法在多个IP上拥有客户端

所以我试着建立一个能告诉我的功能嘿嘿你需要在这个ip上切换这个客户端,这样你就可以在这个ip上安装x客户端了 所以这是我的示例列表。

$ReservedPortsOnIPs = array(
    '10.0.0.1'=>array(
        'TCP:80'=>array(
            'ClientId'=>1
        ),
        'TCP:443'=>array(
            'ClientId'=>1
        )
    ),
    '10.0.0.2'=>array(
        'TCP:80'=>array(
            'ClientId'=>2
        )
    ),
    '10.0.0.3'=>array(
        'TCP:443'=>array(
            'ClientId'=>4
        ),
        'TCP:22'=>array(
            'ClientId'=>4
        ),
    )
);

现在这是我现在的代码。 (我只能找到可用的IP)所以目前如果我试图找到一个可用的IP,可以说TCP:80TCP:443 没有直接可用但如果我将cleint 4从10.0.0.3更改为10.0.0.2,我会10.0.0.3为我要求的端口提供{。}}。

我处于需要执行相同任务的地步但递归但我不知道如何开始? :S

function PortAvailableInNetwork($Port, $ReservedPortsOnIPs){
    foreach($ReservedPortsOnIPs as $IP => $Ports) {
        if(!isset($Ports[$Port]))
            return true; //We found it not used!
    }
    return false; // foreach runned and no ip has the port available.
}
function AddPort($Ports,$ClientId,&$ReservedPortsOnIPs)
{
    //check if ports possibly available
    if(!is_array($Ports))
    {
        if(!PortAvailableInNetwork($Ports,$ReservedPortsOnIPs))
            return false;
    }
    else
        foreach($Ports as $Port)
            if(!PortAvailableInNetwork($Port,$ReservedPortsOnIPs))
                return false;

    $TmpReservedPortOnIp = $ReservedPortsOnIPs;
    //Find Current Ports ClientId Has
    $ClientsPorts = array();
    if(!is_array($Ports))
        $ClientsPorts[] = $Ports;
    else
        foreach($Ports as $Port)
            $ClientsPorts[] = $Port;
    foreach($ReservedPortsOnIPs as $IP => $Ports){
        foreach($Ports as $Port => $PortInfo){
            if($PortInfo['ClientId'] == $ClientId)
            {
                $ClientsPorts[] = $Port;
                unset($TmpReservedPortOnIp[$IP][$Port]); //Remove the clientPort for search purposes
            }
        }
    }
    print_r($ClientsPorts);
    //Now that we have all client ports lets search for an available ip address
    $PortsAvailability = array();
    foreach($TmpReservedPortOnIp as $IP => $Ports){
        $PortsAvailability[$IP] = array('Available'=>array(),'UnAvailable'=>array());
        foreach($ClientsPorts as $Port){
            if(!isset($Ports[$Port]))
                $PortsAvailability[$IP]['Available'][]=$Port;
            else
                $PortsAvailability[$IP]['UnAvailable'][]=$Port;
        }
        if(count($PortsAvailability[$IP]['Available']) == count($ClientsPorts))
            return $IP;
    }
    //if we are at this step this mean no ip had all ports
    usort($PortsAvailability,function($a,$b){
        if(count($a['Available']) > count($b['Available']))
            return -1;
        else
            return 1;
    });
    print_r($PortsAvailability);
}
echo AddPort(array('TCP:80','TCP:443'),5,$ReservedPortsOnIPs);

我愿意改变我的设计,因为我在头脑中按照我的方式看待问题,而且可能不是正确的方法。

感谢您抽出时间阅读我的问题:)

0 个答案:

没有答案
相关问题