Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.04.11;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.028 c
14-1081758739
able
2004-04-12 12:32
2004.04.11
Как убрать ф-цию контроллера домена?


4-1075386758
_hunter_
2004-01-29 17:32
2004.04.11
как добавить пользователя в группу


3-1082039565
miwa
2004-04-15 18:32
2004.04.11
Приведенный код выдает -805-ю ошибку


6-1075456598
Morfeus
2004-01-30 12:56
2004.04.11
просмотр рабочего стола клиента на сервере


14-1081916514
LaidBack
2004-04-14 08:21
2004.04.11
Помогите опознать исполнителя песни: