![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
API для вычисления маски сети. [D6, D7]
frost © (2004-02-03 11:16:00)Как можно получить маску сети по известному IP некоторого интерфейса.
Verg (2004-02-03 19:36:00) [1]
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.
Verg (2004-02-03 12:55:00) [2]Смотрел, смотрел на код... есть некорректность.
Есть вероятность, что он сработает неверно.
Найдете? :)
frost (2004-02-03 12:40:00) [3]Спасибо!
Verg (2004-02-03 12:04:00) [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.
Nikolay M. (2004-02-03 11:56:00) [5]
> Alex Konshin © (03.02.04 11:50) [1]
> Сети или подсети?
> Для сети класс (A,B,C) определяется первыми двумя битами.
???
Я бы поспорил.
http://daemonnews.opennet.ru/docs/HOWTO-RU/mini/IP-Subnetworking.html#AEN70
Alex Konshin (2004-02-03 11:51:00) [6]В смысле двумя самыми старшими битами.
Alex Konshin (2004-02-03 11:50:00) [7]Сети или подсети?
Для сети класс (A,B,C) определяется первыми двумя битами.