Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > как получить все адреса для сети?


Автор: zhz 21.1.2007, 04:32
собственно, есть ip адрес и маска, формат задания маски для удобства неограничен, но думаю лучше ввиде /24 например. Хотелось получить хоть кусочек кода который получает все ip адреса для заданной сети.

Автор: stmamont 22.1.2007, 01:28
наверное надо просто перебрать все адреса и пропинговать их

Добавлено @ 01:35 
например у компонента TIdRowClient есть метод Ping
то есть
Код

TIdRawClient *cl = new TIdRawClient(0);

for(/*по всем адресам где AnsiString Adress - адрес*/)
{
  cl->Host = Adress;
  cl->Ping();
  // результат хранится в cl->ReplyStatus;
}

delete cl;


все это  есть в справке билдера. смотри

Автор: zhz 22.1.2007, 02:34
неееееее, мне совсем не то надо! мне надо написать функцию которая бы получала все адреса для заданной сети, и все!
например, я передаю в функцию два параметра, адрес сети(например 192.168.10.0) и маску(не важног в каком виде) - например /24 и функция должна вывести мне все возможные адреса:
192.168.10.1
192.168.10.2
192.168.10.3
.....................
.....................
.....................
.....................
192.168.10.254
Все просто на этом примере, понятия не имею как делать когда маска будет например /26 или /18

Автор: AntonChik 22.1.2007, 10:20
ну так и делай... перебирай все адреса (0...255) и сравнивай каждый поразрядно конъюктивно с маской...
проблемы с двоичными числами?

Автор: zhz 22.1.2007, 11:12
Цитата(AntonChik @  22.1.2007,  10:20 Найти цитируемый пост)
поразрядно конъюктивно с маской...

вот если бы я знал что это значит, то и не создовал бы тему.... маску  /24 я для примера привел, сам понимаю что в этом диапазоне и считать то нечего (001-254), но маска то может быть и /26 например, 
и вот тут вообще не знаю как посчитать, ну тоесть могу на бумажке с калькулятором посчитать, а как функцию надолбить, не знаю

Автор: stmamont 22.1.2007, 12:14
объясни только что такое /24 и /26 и я скажу как это сделать)

Автор: zhz 22.1.2007, 12:22
Цитата(stmamont @  22.1.2007,  12:14 Найти цитируемый пост)
объясни только что такое /24 и /26 и я скажу как это сделать) 

Значит так.
IP - адрес сети с маской 24 записывается как 192.168.48.0/24
где 24 бита отводится для адреса сети 
11000000.10101000.00110000.00000000
и 8 бит (32-24) отводится для адреса хоста
11000000.10101000.00110000.00000000 маска 255.255.255.0
Адреса начинаются с адреса
11000000.10101000.00110000.00000000 192.168.48.0
а заканчиваются адресом
11000000.10101000.00110000.11111111 192.168.48.255
Первый обозначает сеть 192.168.48.0, а последний broadcast 192.168.48.255 и эти два адреса мы не учитываем.
Значит, диапазон будет от
11000000.10101000.00110000.00000001
до
11000000.10101000.00110000.11111110
или
192.168.48.1 – 192.168.48.254


/24 и /26  это количество бит айпи адреса отводимое для адресации сети,




Автор: Grom 22.1.2007, 15:43
zhz, а если маска 192.168.48.0/26 ? то 10 бит под адрес узла сети. а 10 бит это как будет ?
11000000.10101000.00110000.00000000 так чтоли ?
объясни или дай линк где поподробней почитать.. всегда интересовался но ничего толкового не встречал.

Автор: GIK 22.1.2007, 16:13
Цитата

объясни или дай линк где поподробней почитать..

точно, а алгоритм напишем быстро smile 

Автор: stmamont 22.1.2007, 16:56
а я понял
значит так если у тебя есть какая то маска
то ты смотришь сколько у тебя битов свободных т.е.
8 или 6


Код

int numBits = 8; // пусть 8
for(int i = 0 ; i < (1 << 8) ; ++ i)
{
  // в i хранится значение последних 8 битов
  // если int ip[4] - представление ip адреса, то
  ip[3] = ip[3] | i;

}


Добавлено @ 16:58 
если отсчет идет так
11000000.1  0  1  0  1  0  0  0 .00110000.11111110
87654321.161514131211109 ....

Добавлено @ 16:59 
если нет то  а наоборот то
Код

ip[3] = ip[3] | i << (8 - numBits);

Автор: zhz 22.1.2007, 17:06
Для общего развития всех перцев этого форума, понятия не имеющих что такое IP - адресация, соорудил man. Надеюсь пригодится....smile 
кому понравится, могут плюсик поставить  smile

Добавлено @ 17:14 
Цитата(stmamont @  22.1.2007,  16:56 Найти цитируемый пост)
 i < (1 << 8) 
 ip[3] | i;

а это что значит smile 

Автор: GIK 22.1.2007, 17:39
Цитата

например, я передаю в функцию два параметра, адрес сети(например 192.168.10.0) и маску(не важног в каком виде)

В смысле любой тип данных что ли?
Что-то типа:
Код

void IP_getAdres(int on, int to, int tr, int ch, int mask){
  int bit_1=1;
  if(on & bit_1) 
     cout<<1;
   else 
     cout<<0;  
  while(bit_1<<=1){
   if(on & bit_1) 
     cout<<1;
   else 
     cout<<0;
 }
 /*
  и так далее все остальные составные части....
 */
}


Цитата

Добавлено @ 17:14 

Цитата(stmamont @  22.1.2007,  16:56 ) 
 i < (1 << 8) 
 ip[3] | i; 
а это что значит

Это побитовые операции:
1) операция << - сдвиг влево 
например (1 << 8) = 00000000 00000001 << 8 = 00000001 00000000
все биты смещаются влево

2) операция | (побитовое или)
например 3 | 1 = 00000011 | 00000001 = 00000011 
если хотябы один бит имеет значение "единичка", то в результате единичка сохраняется

Автор: GIK 22.1.2007, 21:29
zhz, блин, супер, спасибо за ман, давно хотел разузнать про IP адресацию.

Код

#include<iostream>
#include<stdio>
# include <conio>

  using namespace std;
 void IP_getAdres(int ip1, int ip2, int ip3, int ip4, int mask){ 
  int diapazon = 32 - mask;

 int maskD=1;
  for(int i=0; i<diapazon; i++){ //Диапазон IP – адресов хостов для заданной сети
     maskD*=2;
  }
  maskD-=1; //;)
  for(int i=1; i<maskD; i++){
   cout<<ip1<<"."<<ip2<<"."<<ip3<<"."<<ip4<<"."<<i<<endl;
  }
};

int main(int argc, char* argv[])
{   int mask;
    cin>>mask;
    IP_getAdres(192,168,48,0,mask);
    getch();
        return 0;
};



Это не то что тебе надо, но принцип тоже, что ты и хотел увидеть.
Очень мне интересно стало, хочу еще больше узнать что и как, и в каком формате, и куда передается информация о IP.
Народ присоединяйся, делитесь инфой кто че знает smile

Автор: Grom 23.1.2007, 11:34
zhz, спасибо. отличный ман. !

Автор: Bima 23.1.2007, 16:54
Вот пример, который ты просил.
Данные заносятся в ListBox.
Ничего сложного, я думал, ты сам бы сделал, причем все исходные данные у тебя были.

Автор: zhz 24.1.2007, 06:44
Цитата(Bima @  23.1.2007,  16:54 Найти цитируемый пост)
от пример, который ты просил.
Данные заносятся в ListBox.
Ничего сложного, я думал, ты сам бы сделал, причем все исходные данные у тебя были. 

то ли лыжи не едут толи ........
СКАЖИ, ГДЕ ТЫ ВИДЕЛ АДРЕС ВИДА  192.168.10.4094 ?  именно такой хост был последним в диапазоне. для адреса 192,168,10,0 и маски 20.
Конечно большое спасибо за то что взялся, но это совсем не правильно работает. я постарался написать доходчивый документ, в котором описана вся процедура нахождения диапазона адресов, 
и она не имеет ничего общего с предложенной тобой

Автор: Bima 24.1.2007, 06:53
не видел!
но переделать пример, относительно маски меньше 24, дело 2 минут. Алгоритм тот же, только придется добавитьеще один цикл по старшим битам маски.

Автор: stmamont 24.1.2007, 13:24
вообще в builder int - 4 байтовый
тоесть весь ip можно запихать в intи соответственно маску
и не придется делать никаких дополнительных циклов)))
все сделается оченб просто в один цикл))

Автор: TiKKi 24.1.2007, 19:01
Так ?
Код

union    IP
{
    byte    ip[4];
    int    _ip;
};

int    GetIPs( byte ip[4], int mask, TStringList* Output )
{
    IP    _IP;
    _IP.ip[3] = ip[0];
    _IP.ip[2] = ip[1];
    _IP.ip[1] = ip[2];
    _IP.ip[0] = ip[3];
    int    Count = 1 << ( 32 - mask );
    for ( ; Count; Count--, _IP._ip++  )
    {
        Output->Add( IntToStr( _IP.ip[3] ) + "." + IntToStr( _IP.ip[2] )+ "." + IntToStr( _IP.ip[1] ) + "." + IntToStr( _IP.ip[0] ) );
    }
    return    0;
}


Надо еще проверки учесть

Автор: stmamont 24.1.2007, 22:43
как то лишком замутно. я бы сделал проще
Код

int ip;
for(int i = 0 ; i < 1 << ( 32 - mask ) ; ++ i)
{
  int nuIP = ip + i;
  // теперь преобразовываем в строку
  Output->Add(IntToStr( nuIP >> 24) + "." + IntToStr(nuIP << 8 >> 24) + "." + IntToStr(nuIP << 16 >> 24) + "." + IntToStr(nuIP << 24 >> 24));
}

Автор: TiKKi 25.1.2007, 04:12
Цитата

как то лишком замутно. я бы сделал проще

Чего замутного? 
Комментарии не написал, т.к. поздно было, спать хотел.
Вот с комментариями:
Код

// С помощью этой структуры получаем IP-адрес в качестве целого числа и наоборот
union    IP
{
    byte    ip[4];
    int    _ip;
};
// Пример вызова функции:
// byte    NetIP[4] = { 192, 168, 0, 0 };
// GetIPs( NetIP, 24, Output );
int    GetIPs( byte ip[4], int mask, TStringList* Output )
{
    IP    _IP;
// Переворачиваем адрес, т.к. старшие байты в памяти хранятся по младшим адреса.
    _IP.ip[3] = ip[0];
    _IP.ip[2] = ip[1];
    _IP.ip[1] = ip[2];
    _IP.ip[0] = ip[3];
// Кол-во хостов в данной сети
    int    Count = 1 << ( 32 - mask );
// Думаю, тут все понятно
    for ( ; Count; Count--, _IP._ip++  )
    {
        Output->Add( IntToStr( _IP.ip[3] ) + "." + IntToStr( _IP.ip[2] )+ "." + IntToStr( _IP.ip[1] ) + "." + IntToStr( _IP.ip[0] ) );
    }
    return    0;
}

Автор: stmamont 25.1.2007, 17:07
TiKKi, нет смысл мне понятен. но можно поступить легче
мой код покороче и попроще будет)

Автор: TiKKi 25.1.2007, 17:54
спорить не буду, мне и свой и твой вариант нравится  smile 

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