From b8034ec3c936ad0c0a4c389273451c2c8dabefa1 Mon Sep 17 00:00:00 2001 From: sushen339 Date: Tue, 18 Nov 2025 17:12:31 +0800 Subject: [PATCH] --- blockip/bip | Bin 58392 -> 58392 bytes blockip/src/stats.c | 33 ++++++++++++++++++++++++++++++--- 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/blockip/bip b/blockip/bip index 639120f95dcd9b00a46341c8fd06ad5c46f3f28c..01a457f77c2812f0e84c90f720a5a2abef079edf 100644 GIT binary patch delta 5744 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 bNd4l-CyG4NZ0z{);AJ)+QvTC%N7DZRycu;? delta 5490 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 diff --git a/blockip/src/stats.c b/blockip/src/stats.c index 49308b5..555a147 100644 --- a/blockip/src/stats.c +++ b/blockip/src/stats.c @@ -182,11 +182,38 @@ void show_subnet_aggregation(void) { } fclose(fp); - /* 排序:先按count降序,再按mask升序 */ + /* 排序:先按count降序,再按subnet前缀分组(层级显示),最后按mask升序 */ for (int i = 0; i < agg_count - 1; ++i) { for (int j = i + 1; j < agg_count; ++j) { - if (agg[j].count > agg[i].count || - (agg[j].count == agg[i].count && agg[j].mask < agg[i].mask)) { + bool should_swap = false; + + if (agg[j].count > 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) { char tmp_subnet[64]; int tmp_count = agg[i].count, tmp_mask = agg[i].mask; strcpy(tmp_subnet, agg[i].subnet);