【发布时间】:2015-03-22 10:47:26
【问题描述】:
我有一个似乎包含子任务的任务。取两个或多个 ip 段(可能是 192.168.1.32/27、192.168.1.64/28 和 192.168.1.128/25)并将它们加入最近的段(192.168.1.0/24 使用前 ip 段)。检查是否可以加入段必须是。
任何人都知道是否有一个带有工具的 php 类可以做到这一点 - 或者类似的几个函数?
/拉尔斯
编辑: [代码]
$ip_id_array = array();
$ip_level_array = array();
$ip_segment_array = array();
$ip_cidr_array = array();
$toplevel_array = array();
foreach ($_POST["net_ip_id"] AS $ip_id)
{
$sql = "
SELECT
ip_segments.ip_id,
ip_segments.ip_segment,
ip_segments.ip_level,
ip_segments.ip_cidr
FROM
ip_segments
WHERE
ip_id = '".$ip_id."'
";
$relip_res = mysqli_query($db, $sql) or cc("ERROR: SQL Select subsegments related", $sql, mysqli_error($db) , $_SESSION["u_id"], $this_document);
$ip_array = mysqli_fetch_assoc($relip_res);
$ip_id_array[] = $ip_array["ip_id"];
$ip_level_array[] = $ip_array["ip_level"];
$ip_segment_array[] = $ip_array["ip_segment"];
$ip_cidr_array[] = $ip_array["ip_cidr"];
if ($ip_array["ip_level"] != 0 && !empty($ip_array["ip_level"]))
{
$sql = "
SELECT
ip_segments.ip_id,
ip_segments.ip_segment,
ip_segments.ip_level,
ip_segments.ip_cidr
FROM
ip_segments
WHERE
ip_id = '".$ip_array["ip_level"]."'
";
$relip_res = mysqli_query($db, $sql) or cc("ERROR: SQL Select subsegments related", $sql, mysqli_error($db) , $_SESSION["u_id"], $this_document);
$toplevel[] = mysqli_fetch_assoc($relip_res);
}
}
$ip_level_array = array_unique($ip_level_array);
$ip_cidr_array = array_unique($ip_cidr_array);
$toplevel = array_unique($toplevel);
if(sizeof($ip_level_array) > 1)
$field_alerts[] = "IP Segments must be within the same segment.!";
if ($ip_cidr_array[0] <= 1)
$field_alerts[] = "Subnetmasks must be larger than or equal to 1";
if ($toplevel <= 1)
$field_alerts[] = "No Toplevel to merge to!";
if (sizeof($field_alerts) < 1)
{
$new_segment = $ip_id_array[0];
$new_cidr = $toplevel[0]["ip_cidr"];
}
[/代码]
编辑: 一个段是顶层 192.168.1.0/24 (id 1 - level 0) 它可以被划分为几种不同类型的子网,范围从 /25 到 /32(主机)。 假设我们分段为 /26。这给出了以下内容:
ID, Level, IP, CIDR
2,1,192.168.1.0,26
3,1,192.168.1.64,26
4,1,192.168.1.128,26
5,1,192.168.1.192,26
见:http://jodies.de/ipcalc?host=192.168.1.0&mask1=24&mask2=26
我需要一段代码,它可以获取一个 id 数组,查看段和 cidr 并查看将段连接到最近超网的可能性(在本例中为 /25 或 /24) 选项:
Join ID, Result
2,3 => true (/25)
2,4 => false (networks not "next" to each other (a /26 between))
3,4 => false (subsegments will split toplevel (/25) segment
4,5 => true (/25)
如果需要更多信息,请告诉我。
【问题讨论】:
-
最后一个ip怎么到0/24的?
-
(感觉无知)在这种情况下,确定 192.168.1.0/24 是最近的网段的标准是什么?
-
需要查看段并计算段的“紧密度”(段是否足够接近可以连接)
-
@Whirlwind 已编辑帖子
标签: php network-programming ip