Php 查找到主机端口的可用IP
我有一个头痛,试图找出如何在我的列表中找到一个可用端口的IP地址。 我的问题其实很简单,但我就是不知道如何编程。 我希望有人能给我指出正确的方向。 也许有一种方法可以优化列表,使其更易于搜索 这是我的问题。 我有一个IP列表,每个端口上都有一个客户端拥有的多个端口。 我可以在同一IP上有多个客户端,但不能在多个IP上有一个客户端 所以我试图构建一个函数,告诉我“嘿,你需要在这个ip上切换这个客户端,这样你就可以在这个ip上有x客户端了。” 下面是我的示例列表Php 查找到主机端口的可用IP,php,tcp,Php,Tcp,我有一个头痛,试图找出如何在我的列表中找到一个可用端口的IP地址。 我的问题其实很简单,但我就是不知道如何编程。 我希望有人能给我指出正确的方向。 也许有一种方法可以优化列表,使其更易于搜索 这是我的问题。 我有一个IP列表,每个端口上都有一个客户端拥有的多个端口。 我可以在同一IP上有多个客户端,但不能在多个IP上有一个客户端 所以我试图构建一个函数,告诉我“嘿,你需要在这个ip上切换这个客户端,这样你就可以在这个ip上有x客户端了。” 下面是我的示例列表 $ReservedPortsOnIP
$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
和客户端4tcp: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
和客户端4tcp:22、tcp:443
或者客户端2和4都可以在10.0.0.3
上,这并不重要。重要的是没有一个客户端可以在一个ipAh上拥有相同的端口,我明白了-但是如果客户端#4也需要80,那该怎么办?然后函数需要返回false或impossible来添加端口请求或类似的东西。但是我可以给客户4 80分,但是新客户5不能有80分和443分。那么,您的问题更多的是关于如何通过PHP
自动平衡客户端到正确的ip/端口,以及您目前是如何做到这一点的(如果是这样的话)?