在網路設備軟體開發中,常需將接收封包的訊息類型與預定義類型表比對。本文展示如何透過字串陣列遍歷與大小寫不敏感比較實現此功能。
static char *_default_packet_types[] = {
"ddos client quota", "ddos server quota",
"blocked ports", "blocked sites",
"ip scan", "port scan",
"ip source route", "icmp flooding",
"ike flooding", "ipsec flooding",
"ip spoofing sites", "syn flooding",
"udp flooding", "tcp syn checking failed",
NULL // 陣列結束標記
};
boolean pr_get_default_packet_flag_from_msg(PacketFilterMessageTable *packetTable, char **packetType) {
char *p_msg = NULL;
wgpr_boolean flag = FALSE;
char **type_ptr = NULL;
// 參數檢查
if (!packetTable) return flag;
if (packetTable->_tag_id != FWDENY_TAG ||
packetTable->_msg == NULL ||
packetTable->_msg[0] == '\0')
return flag;
p_msg = packetTable->_msg;
// 遍歷字串陣列進行比對
for (type_ptr = _default_packet_types; *type_ptr != NULL; type_ptr++) {
// strncasecmp: 大小寫不敏感比較,長度為目標字串長度
if (!strncasecmp(p_msg, *type_ptr, strlen(*type_ptr))) {
flag = TRUE;
break;
}
}
*packetType = flag == TRUE ? DEFAULTPACKET : DENIEDPACKET;
return flag;
}
char **type_ptr 走訪,以 NULL 為終止條件strncasecmp 避免大小寫差異導致誤判strlen(*type_ptr) 確保完整匹配,避免部分匹配誤判if (pr_get_default_packet_flag_from_msg(pk_t, &packetType)) {
is_dflt_packet = TRUE;
}
原始碼中 sizeof(*type_ptr) - 1 錯誤計算字串長度(實為指標大小),應改用 strlen(*type_ptr)。此外,若效能敏感可考慮雜湊表或 Trie 樹優化查找速度。