From 37db31dd475125d0ae5601dad61dc516201e5c7a Mon Sep 17 00:00:00 2001 From: sushen339 Date: Tue, 18 Nov 2025 14:36:11 +0800 Subject: [PATCH] --- blockip/bip | Bin 58344 -> 58344 bytes blockip/src/stats.c | 106 +++++++++++++++++++++++++++++--------------- 2 files changed, 70 insertions(+), 36 deletions(-) diff --git a/blockip/bip b/blockip/bip index 1a451ef962e996faf884d0a1fd042543b81a3d98..e3f7096d39a432ee6ab62d55080ff789cef6796e 100644 GIT binary patch delta 11321 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的,并去重:如果大段和小段数量相同则只显示小段 */ bool has_output = false; int show_count = 0; + int aggregated_count = 0; + for (int i = 0; i < agg_count && show_count < 10; ++i) { - if (agg[i].count >= 2) { - /* 检查是否有更小掩码的段具有相同count */ - bool skip = false; - if (agg[i].mask == 8) { - for (int j = 0; j < agg_count; ++j) { - if (agg[j].mask > 8 && agg[j].count == agg[i].count && - strncmp(agg[j].subnet, agg[i].subnet, strlen(agg[i].subnet)) == 0) { - skip = true; - break; - } - } - } else if (agg[i].mask == 16) { - for (int j = 0; j < agg_count; ++j) { - if (agg[j].mask > 16 && agg[j].count == agg[i].count && - strncmp(agg[j].subnet, agg[i].subnet, strlen(agg[i].subnet)) == 0) { - skip = true; - break; - } - } - } - - if (!skip) { - has_output = true; - if (agg[i].mask == 8) { - printf(" - %-18s %s(%d 个)%s\n", - strcat(agg[i].subnet, ".0.0.0/8"), C_RED, agg[i].count, C_RESET); - } else if (agg[i].mask == 16) { - printf(" - %-18s %s(%d 个)%s\n", - strcat(agg[i].subnet, ".0.0/16"), C_RED, agg[i].count, C_RESET); - } else if (agg[i].mask == 24) { - printf(" - %-18s %s(%d 个)%s\n", - strcat(agg[i].subnet, ".0/24"), C_RED, agg[i].count, C_RESET); - } - show_count++; + if (agg[i].count < 2) continue; + + /* 检查是否被更精确的段取代(相同count但更小mask) */ + bool replaced = false; + for (int j = 0; j < agg_count; ++j) { + if (agg[j].mask > agg[i].mask && agg[j].count == agg[i].count && + strncmp(agg[j].subnet, agg[i].subnet, strlen(agg[i].subnet)) == 0) { + replaced = true; + break; } } + if (replaced) continue; + + has_output = true; + + /* 检查是否被已显示的更大段覆盖,避免重复计数 */ + bool covered = false; + for (int k = 0; k < i; ++k) { + if (agg[k].count >= 2 && agg[k].mask < agg[i].mask) { + /* 检查k是否也被取代 */ + bool k_replaced = false; + for (int m = 0; m < agg_count; ++m) { + if (agg[m].mask > agg[k].mask && agg[m].count == agg[k].count && + strncmp(agg[m].subnet, agg[k].subnet, strlen(agg[k].subnet)) == 0) { + k_replaced = true; + break; + } + } + if (!k_replaced && strncmp(agg[i].subnet, agg[k].subnet, strlen(agg[k].subnet)) == 0) { + covered = true; + break; + } + } + } + + if (!covered) { + 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); + show_count++; } + /* 计算散乱IP数量 */ + int total_ipv4 = 0; + FILE *fp_count = fopen(PERSIST_FILE, "r"); + if (fp_count) { + char line_tmp[MAX_LINE_LEN]; + while (fgets(line_tmp, sizeof(line_tmp), fp_count)) { + line_tmp[strcspn(line_tmp, "\n")] = 0; + if (strlen(line_tmp) > 0) { + char *pipe = strchr(line_tmp, '|'); + if (pipe) *pipe = '\0'; + if (!strchr(line_tmp, ':')) total_ipv4++; + } + } + fclose(fp_count); + } + int scattered_count = total_ipv4 - aggregated_count; + if (!has_output) { - printf(" - (散乱分布 IPv4)\n"); + if (scattered_count > 0) { + printf(" - (散乱分布 IPv4) (%d 个)\n", scattered_count); + } else if (total_ipv4 > 0) { + printf(" - (散乱分布 IPv4)\n"); + } + } else if (scattered_count > 0) { + printf(" - (散乱分布 IPv4) (%d 个)\n", scattered_count); } if (v6_count > 0) { - printf(" - (IPv6 地址) (%d 个)\n", v6_count); + printf(" - (IPv6 地址) (%d 个)\n", v6_count); } printf("\n");