Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > Range IP CIDR


Автор: block 1.4.2009, 11:44
Здравствуйте.
Возникла необходимость написать программку по переводу диапазона 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).

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)