Форум: "Сети";
Текущий архив: 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.042 c