Здравствуйте. Возникла необходимость написать программку по переводу диапазона ip адресов в CIDR формат.
например:
Код | ipcalc 3.14.65.16 - 4.17.135.31 deaggregate 3.14.65.16 - 4.17.135.31 3.14.65.16/28 3.14.65.32/27 3.14.65.64/26 3.14.65.128/25 3.14.66.0/23 3.14.68.0/22 3.14.72.0/21 3.14.80.0/20 3.14.96.0/19 3.14.128.0/17 3.15.0.0/16 3.16.0.0/12 3.32.0.0/11 3.64.0.0/10 3.128.0.0/9 4.0.0.0/12 4.16.0.0/16 4.17.0.0/17 4.17.128.0/22 4.17.132.0/23 4.17.134.0/24 4.17.135.0/27
|
набросал следующее:
Код | /* gcc -pedantic -ansi -Wall -s test.c -o test */
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <arpa/inet.h> #include <netinet/in.h>
int main(int argc, char *argv[]) { char min_ip[16] = "", max_ip[16] = ""; int i, n; unsigned long min_ip_d, max_ip_d, mask, hosts, max_ran_b; struct in_addr min, max;
if(argc < 3) { printf("Usage: %s IP-min IP-max\n",argv[0]); exit(0); }
snprintf(min_ip,strlen(argv[1])+1,"%s",argv[1]); snprintf(max_ip,strlen(argv[2])+1,"%s",argv[2]);
if (inet_aton(min_ip, &min) <= 0) { printf("Error: Bad adress %s\n", min_ip); exit(0); } if (inet_aton(max_ip, &max) <= 0) { printf("Error: Bad adress %s\n", max_ip); exit(0); }
printf("Range: %s - %s\n",min_ip,max_ip);
min_ip_d = ntohl(min.s_addr); max_ip_d = ntohl(max.s_addr);
while (min_ip_d <= max_ip_d) { mask = (0xFFFFFFFF - min_ip_d); if(min_ip_d % 2 == 0) mask ++; mask = mask | min_ip_d; hosts = mask ^ 0xFFFFFFFF; max_ran_b = min_ip_d | hosts;
if(max_ran_b < max_ip_d) { for(i = 0, n = 0; i <= 31; i++ ) if(((mask >> i) & 0x01)) n++; printf("%lu.%lu.%lu.%lu/%i\n", (min_ip_d>>24)&0xFF, (min_ip_d>>16)&0xFF, (min_ip_d>>8)&0xFF, min_ip_d&0xFF,n); } else { printf("-------------\n"); printf("%lu.%lu.%lu.%lu\n", (min_ip_d>>24)&0xFF, (min_ip_d>>16)&0xFF, (min_ip_d>>8)&0xFF, min_ip_d&0xFF); exit(0); }
min_ip_d = max_ran_b + 1; }
return 0; }
|
не могу сообразить как считать при уменьшении диапазона маски (то есть в пределах 4.0.0.0 - 4.17.135.31).
|