Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/250.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 查找到主机端口的可用IP_Php_Tcp - Fatal编程技术网

Php 查找到主机端口的可用IP

Php 查找到主机端口的可用IP,php,tcp,Php,Tcp,我有一个头痛,试图找出如何在我的列表中找到一个可用端口的IP地址。 我的问题其实很简单,但我就是不知道如何编程。 我希望有人能给我指出正确的方向。 也许有一种方法可以优化列表,使其更易于搜索 这是我的问题。 我有一个IP列表,每个端口上都有一个客户端拥有的多个端口。 我可以在同一IP上有多个客户端,但不能在多个IP上有一个客户端 所以我试图构建一个函数,告诉我“嘿,你需要在这个ip上切换这个客户端,这样你就可以在这个ip上有x客户端了。” 下面是我的示例列表 $ReservedPortsOnIP

我有一个头痛,试图找出如何在我的列表中找到一个可用端口的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:80
TCP:443
没有直接可用的,但如果我将cleint 4从
10.0.0.3
更改为
10.0.0.2
我将为我请求的端口提供
10.0.0.3

我现在需要做同样的任务,但我不知道如何开始

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);
我愿意改变我的设计,因为我是在我的头上这样做的,我可以看到问题,这可能不是正确的方式来做


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

Re:“如果我将客户端4从10.0.0.3更改为10.0.0.2,我将为我询问的端口提供10.0.0.3。“,但是你会如何处理客户端#2?它们都可以在
10.0.0.2
上,因为它们不需要客户端2需要的相同端口
tcp:80
和客户端4
tcp:22,tcp:443
,或者客户端2和4都可以在
10.0.0.3
上,这并不重要。重要的是没有一个客户端可以在一个ipAh上拥有相同的端口,我明白了-但是如果客户端#4也需要80,那该怎么办?然后函数需要返回false或impossible来添加端口请求或类似的东西。但是我可以给客户4 80分,但是新客户5不能有80分和443分。那么,您的问题更多的是关于如何通过
PHP
自动将客户端平衡到正确的ip/端口,以及您目前是如何做到这一点的(如果是这样的话)?Re:“如果我将客户端4从10.0.0.3更改为10.0.0.2,我将有10.0.0.3可用于我请求的端口。”,但是,您会如何处理客户端2?它们都可以在
10.0.0.2
上,因为它们不需要客户端2需要的相同端口
tcp:80
和客户端4
tcp:22、tcp:443
或者客户端2和4都可以在
10.0.0.3
上,这并不重要。重要的是没有一个客户端可以在一个ipAh上拥有相同的端口,我明白了-但是如果客户端#4也需要80,那该怎么办?然后函数需要返回false或impossible来添加端口请求或类似的东西。但是我可以给客户4 80分,但是新客户5不能有80分和443分。那么,您的问题更多的是关于如何通过
PHP
自动平衡客户端到正确的ip/端口,以及您目前是如何做到这一点的(如果是这样的话)?