From cc8191707ee7624cb1d571f6c7501cad4e98be3f Mon Sep 17 00:00:00 2001 From: sushen339 Date: Tue, 18 Nov 2025 17:20:28 +0800 Subject: [PATCH] --- blockip/bip | Bin 58392 -> 58392 bytes blockip/src/stats.c | 100 +++++++++++++++++++++++++++----------------- 2 files changed, 61 insertions(+), 39 deletions(-) diff --git a/blockip/bip b/blockip/bip index 01a457f77c2812f0e84c90f720a5a2abef079edf..1cf2140c80bae21fcd0434a5d53af286ea97f1e5 100644 GIT binary patch delta 7400 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 delta 6918 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 agg[i].count) { - /* count大的排前面 */ - should_swap = true; - } else if (agg[j].count == agg[i].count) { - /* count相同时,检查是否有包含关系 */ - int prefix_match = 0; - const char *p1 = agg[i].subnet, *p2 = agg[j].subnet; - while (*p1 && *p2 && *p1 == *p2) { - prefix_match++; - p1++; - p2++; - } - - if (prefix_match > 0 && (*p1 == '\0' || *p2 == '\0' || *p1 == '.' || *p2 == '.')) { - /* 有前缀匹配,mask小的(大段)排前面 */ - if (agg[j].mask < agg[i].mask) { - should_swap = true; - } - } else { - /* 无关系,按字典序 */ - if (strcmp(agg[j].subnet, agg[i].subnet) < 0) { - should_swap = true; - } - } - } - - if (should_swap) { + if (agg[j].count > agg[i].count || + (agg[j].count == agg[i].count && strcmp(agg[j].subnet, agg[i].subnet) < 0)) { char tmp_subnet[64]; int tmp_count = agg[i].count, tmp_mask = agg[i].mask; strcpy(tmp_subnet, agg[i].subnet); @@ -227,6 +200,46 @@ void show_subnet_aggregation(void) { } } + /* 第二步:将子网段移到父网段后面形成层级 */ + for (int i = 0; i < agg_count; ++i) { + /* 查找i的所有直接子网段(下一级),移到i后面 */ + int insert_pos = i + 1; + + /* 先跳过已经在正确位置的子网 */ + while (insert_pos < agg_count && + agg[insert_pos].mask > agg[i].mask && + strncmp(agg[insert_pos].subnet, agg[i].subnet, strlen(agg[i].subnet)) == 0) { + insert_pos++; + } + + /* 从insert_pos后面查找其他子网 */ + for (int j = insert_pos; j < agg_count; ++j) { + /* 检查j是否是i的子网(前缀完全匹配且mask更大) */ + size_t prefix_len = strlen(agg[i].subnet); + if (agg[j].mask > agg[i].mask && + strncmp(agg[j].subnet, agg[i].subnet, prefix_len) == 0 && + (agg[j].subnet[prefix_len] == '.' || agg[j].subnet[prefix_len] == '\0')) { + /* j是i的子网,移动到insert_pos */ + char tmp_subnet[64]; + int tmp_count = agg[j].count, tmp_mask = agg[j].mask; + strcpy(tmp_subnet, agg[j].subnet); + + /* 将insert_pos到j-1的元素向后移动 */ + for (int k = j; k > insert_pos; --k) { + agg[k].count = agg[k-1].count; + agg[k].mask = agg[k-1].mask; + strcpy(agg[k].subnet, agg[k-1].subnet); + } + + /* 插入到insert_pos */ + agg[insert_pos].count = tmp_count; + agg[insert_pos].mask = tmp_mask; + strcpy(agg[insert_pos].subnet, tmp_subnet); + insert_pos++; + } + } + } + /* 输出聚合结果,只显示count>=2的,并去重:如果大段和小段数量相同则只显示小段 */ bool has_output = false; int show_count = 0; @@ -239,26 +252,35 @@ void show_subnet_aggregation(void) { has_output = true; - /* 检查是否被已显示的更大段覆盖,避免重复计数 */ - bool covered = false; + /* 检查是否是子网(用于缩进显示和重复计数检测) */ + bool is_child = false; for (int k = 0; k < i; ++k) { if (agg[k].count >= 2 && agg[k].mask < agg[i].mask && - !is_agg_replaced(agg, agg_count, k) && - strncmp(agg[i].subnet, agg[k].subnet, strlen(agg[k].subnet)) == 0) { - covered = true; - break; + !is_agg_replaced(agg, agg_count, k)) { + size_t prefix_len = strlen(agg[k].subnet); + if (strncmp(agg[i].subnet, agg[k].subnet, prefix_len) == 0 && + (agg[i].subnet[prefix_len] == '.' || agg[i].subnet[prefix_len] == '\0')) { + is_child = true; + break; + } } } - if (!covered) { + /* 非子网段才计入aggregated_count(避免重复计数) */ + if (!is_child) { aggregated_count += agg[i].count; } - /* 显示段信息 */ + /* 显示段信息,子网段增加缩进 */ char display_subnet[64]; const char *suffix = (agg[i].mask == 8) ? ".0.0.0/8" : (agg[i].mask == 16) ? ".0.0/16" : ".0/24"; snprintf(display_subnet, sizeof(display_subnet), "%s%s", agg[i].subnet, suffix); - printf(" - %-18s %s(%d 个)%s\n", display_subnet, C_RED, agg[i].count, C_RESET); + + if (is_child) { + printf(" └─ %-16s %s(%d 个)%s\n", display_subnet, C_RED, agg[i].count, C_RESET); + } else { + printf(" - %-18s %s(%d 个)%s\n", display_subnet, C_RED, agg[i].count, C_RESET); + } show_count++; }