Модераторы: xvr
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Range IP CIDR 
V
    Опции темы
block
Дата 1.4.2009, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 20.12.2006

Репутация: 1
Всего: 1



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


Это сообщение отредактировал(а) block - 1.4.2009, 12:12
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.1120 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.