我很头疼,试图弄清楚如何在列表中找到可用端口的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
为我要求的端口提供{。}}。
我处于需要执行相同任务的地步但递归但我不知道如何开始? :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);
我愿意改变我的设计,因为我在头脑中按照我的方式看待问题,而且可能不是正确的方法。
感谢您抽出时间阅读我的问题:)