問題描述:
在路由器中,一般來說**模組採用最大字首匹配原則進行目的埠查詢,具體如下:
ip位址和子網位址所帶掩碼做and運算後,得到的值與子網位址相同,則該ip位址與該子網匹配。
比如:192.168.1.100&255.255.255.0 = 192.168.1.0,則該ip和子網192.168.1.0匹配
子網:192.168.1.128/255.255.255.192
192.168.1.100&255.255.255.192 = 192.168.1.64,則該ip和子網192.168.1.128不匹配
最大字首匹配:
192.168.1.0可以表示為11000000.10101000.00000001.00000000
ip位址192.168.1.100,同時匹配子網192.168.1.0/255.255.255.0和子網192.168.1.64/255.255.255.192,
但對於子網192.168.1.64/255.255.255.192,匹配位數達到26位,多於子網192.168.1.0/255.255.255.0的24位,
因此192.168.1.100最大字首匹配子網是192.168.1.64/255.255.255.192。
請程式設計實現上述最大字首匹配演算法。
要求實現函式:
void max_prefix_match(const char *ip_addr, const char *net_addr_array, int *n)
表現形式如上述,子網位址和子網掩碼用』/』分開,嚴格保證是
合法形式的字串;如果讀到空字串,表示子網位址列表結束
【輸出】n:最大字首匹配子網在*net_addr_array陣列中對應的下標值。如果沒有匹配返回-1
示例 輸入:
ip_addr = "192.168.1.100"
net_addr_array =
"192.168.1.128/255.255.255.192",
"192.168.1.0/255.255.255.0",
"192.168.1.64/255.255.255.192",
"0.0.0.0/0.0.0.0",
輸出:n = 2
這題真麻煩,搞了好久~分高就是難
1 #include2 #include3 #include4void max_prefix_match(const
char *ip_addr, const
char *net_addr_array, int *n)523
if (*p == '\0'
)27 ip[l++] =j;
28 p++;29}
30 l = 0
;31 printf("
ip:\n");
32for (l=0; l < 4; l++)
33 printf("
%d "
,ip[l]);
34 printf("\n"
);35 l = 0;36
while (*net_addr_array[i] != '\0'
)3748 net[l++] =j;
49if (*p == '/'
)50break
;51 p++;52}
53 p++;
54 l = 0;55
while (*p != '\0'
)5664if (*p == '\0'
)68 mask[l++] =j;
69 p++;70}
71 printf("\n"
);72
for (l=0; l < 4; l++)
73 printf("
%d "
,net[l]);
74 printf("/ "
);75
for (l=0; l < 4; l++)
76 printf("
%d "
,mask[l]);
77 printf("
\ncal ip & mask:\n");
78for (l=0; l < 4; l++)
7990 temp = temp >> 1;91
}92}93
if (l >= 4)94
101}
102 sum = 0
;103 i++;
104 l = 0
;105 printf("\n"
);106
}107 printf("\n"
);108
}109
intmain()
110;
124int *n;
125 n = (int*)malloc(sizeof(int
));126
max_prefix_match(ip_addr, net_addr_array, n);
127 printf("
n = %d\n
",*n);
128129 }
匹配IP位址
正規表示式 25 0 5 2 0 4 0 9 0 1 0 9 1 9 0 9 1 9 25 0 5 2 0 4 0 9 0 1 0 9 1 9 0 9 1 9 0 25 0 5 2 0 4 0 9 0 1 0 9 1 9 0 9 1 9 0 25 0 5 2 0 4 0 9 0 1 0 9 1 9 ...
python匹配ip位址
ip位址是用3個 號作為分隔符,分割4個數字,每個數字的取值在 0,255 一般日誌檔案中的ip位址都是有效的ip位址,不需要我們再去驗證,因此,若從日誌檔案中提取ip,那麼可以簡單寫成這樣 import re s kkk 192.168.1.136 kkk 192.168.1.137 kk 192...
python IPy 匹配ip位址段
在ip位址規劃中,涉及到計算大量的ip位址,包括網段 網路掩碼 廣播位址 子網數 ip型別等 別擔心,ipy模組拯救你。ipy模組可以很好的輔助我們高效的完成ip的規劃工作。wget no check certificate tar zxvf ipy 0.81.tar.gz cd ipy 0.81 ...