Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];

Вниз

API для вычисления маски сети.   Найти похожие ветки 

 
frost ©   (2004-02-03 11:16) [0]

Как можно получить маску сети по известному IP некоторого интерфейса.


 
Alex Konshin ©   (2004-02-03 11:50) [1]

Сети или подсети?
Для сети класс (A,B,C) определяется первыми двумя битами.


 
Alex Konshin ©   (2004-02-03 11:51) [2]

В смысле двумя самыми старшими битами.


 
Nikolay M. ©   (2004-02-03 11:56) [3]


> Alex Konshin ©   (03.02.04 11:50) [1]
> Сети или подсети?
> Для сети класс (A,B,C) определяется первыми двумя битами.

???
Я бы поспорил.
http://daemonnews.opennet.ru/docs/HOWTO-RU/mini/IP-Subnetworking.html#AEN70


 
Verg ©   (2004-02-03 12:04) [4]

Если про классы адресов:
A - Старший бит = 0        
B - два старших бита = 10
С - три старших бита = 110
D - четыре старших = 1110
E - пять старших = 11110

A, B, C - сети общего пользования
D       - многоадресная рассылка (multicasting)
E       - зарезервирован

Насчет подсетей и получения все возможных масок, адресов и индексов (терпение кончилось :))) )

program IpAddrs;

{$APPTYPE CONSOLE}

uses
 Windows,
 WinSock,
 SysUtils;

type
TMIB_IPADDRROW = record
   dwAddr,            // IP адрес
   dwIndex,           // Индекс сетевого интерфейса, который имеет этот IP адрес
   dwMask,            // Маска подсети
   dwBCastAddr,      
   dwReasmSize : DWORD;
   unused1,
   unused2 : WORD;
end;
PMIB_IPADDRROW = ^TMIB_IPADDRROW;

TMIB_IPADDRTABLE = record
 dwNumEntries : DWORD;
 table        : array[0..0] of TMIB_IPADDRROW;
end;
PMIB_IPADDRTABLE= ^TMIB_IPADDRTABLE;

function GetIpAddrTable(AddrTable : PMIB_IPADDRTABLE; var pdwSize : ULONG; bOrder : BOOL): DWORD;
        stdcall;
        external "IPHLPAPI.DLL" name "GetIpAddrTable";
       
var AddrTable : PMIB_IPADDRTABLE;
   TableSize : ULONG;
   I : integer;
   sIp,
   sMsk,
   sBrd : string;

begin
 TableSize := 0;
 GetIpAddrTable(nil, TableSize, false);
 if TableSize<>0 then
 begin
   GetMem(AddrTable, TableSize);
   try
     if GetIpAddrTable(AddrTable, TableSize, false)= NO_ERROR then
     begin
       WriteLn("    IP Address       Subnet mask     Broadcast address  IF Index");
       WriteLn("----------------------------------------------------------------");
       for I:=0 to AddrTable.dwNumEntries-1 do
       begin
         sBrd :=inet_ntoa(in_addr(
                           AddrTable.table[i].dwAddr or (not AddrTable.table[i].dwMask)
                         ));
         sIp  := inet_ntoa(in_addr(AddrTable.table[i].dwAddr));
         sMsk := inet_ntoa(in_addr(AddrTable.table[i].dwMask));
         WriteLn(
           Format("%17s %17s %17s 0x%-8x",[sIp, sMsk, sBrd, AddrTable.table[i].dwIndex])
         );
       end;
    end;
   finally
     FreeMem(AddrTable);
   end;
 end;
 ReadLn;
end.


 
frost ©   (2004-02-03 12:40) [5]

Спасибо!


 
Verg ©   (2004-02-03 12:55) [6]

Смотрел, смотрел на код...  есть некорректность.
Есть вероятность, что он сработает неверно.

Найдете? :)


 
Verg ©   (2004-02-03 19:36) [7]

var AddrTable : PMIB_IPADDRTABLE;
   TableSize, Tsz : ULONG;
   I : integer;
   sIp,
   sMsk,
   sBrd : string;
   Err : DWORD;
begin
 TableSize := 0;
 AddrTable := nil;

 try
   repeat
     Err := GetIpAddrTable(AddrTable, Tsz, false);

     if Err <> ERROR_INSUFFICIENT_BUFFER then
       break;
     if Tsz > TableSize then
     begin
       TableSize := Tsz;
       if AddrTable = nil then
         GetMem(AddrTable, TableSize)
       else
         ReallocMem(AddrTable, TableSize);
     end else
     begin
       TableSize := 0;
       break;
     end;
   until false;

   if (TableSize<>0) and (Err = NO_ERROR) then
   begin
     WriteLn("    IP Address       Subnet mask     Broadcast address  IF Index");
     WriteLn("----------------------------------------------------------------");
     for I:=0 to AddrTable.dwNumEntries-1 do
     begin
       sBrd :=inet_ntoa(in_addr(
                         AddrTable.table[i].dwAddr or (not AddrTable.table[i].dwMask)
                       ));
       sIp  := inet_ntoa(in_addr(AddrTable.table[i].dwAddr));
       sMsk := inet_ntoa(in_addr(AddrTable.table[i].dwMask));
       WriteLn(
         Format("%17s %17s %17s 0x%-8x",[sIp, sMsk, sBrd, AddrTable.table[i].dwIndex])
       );
     end;
   end;

 finally
   if AddrTable<>nil then
     FreeMem(AddrTable);
 end;
 ReadLn;
end.



Страницы: 1 вся ветка

Форум: "Сети";
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.039 c
8-1075969776
nike
2004-02-05 11:29
2004.04.11
winamp (in_mp3.dll, out_wave.dll) + delphi


14-1082558962
Frozzen
2004-04-21 18:49
2004.04.11
Объявление процедуры


1-1082433197
Bond
2004-04-20 07:53
2004.04.11
Печать


4-1075543721
__Alex__
2004-01-31 13:08
2004.04.11
сокращение имен


14-1079836948
Думкин
2004-03-21 05:42
2004.04.11
С днем рождения! 21 марта





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский