Este es un ejemplo de como obtener diferentes parámetros de red de nuestro equipo, utilizando solo funciones de la API.
Es una aplicación de consola
Código Delphi
[-]
program ipview;
{$APPTYPE CONSOLE}
uses Windows, SysUtils;
const
MAX_HOSTNAME_LEN = 128;
MAX_DOMAIN_NAME_LEN = 128;
MAX_SCOPE_ID_LEN = 256;
MAX_INTERFACE_NAME_LEN = 256;
MAXLEN_PHYSADDR = 8;
MAXLEN_IFDESCR = 256;
MIB_IF_TYPE_OTHER = 1;
MIB_IF_TYPE_ETHERNET = 6;
MIB_IF_TYPE_TOKENRING = 9;
MIB_IF_TYPE_FDDI = 15;
MIB_IF_TYPE_PPP = 23;
MIB_IF_TYPE_LOOPBACK = 24;
MIB_IF_TYPE_SLIP = 28;
type
PULONG = ^ULONG;
IP_ADDRESS_STRING = array[1..16] of Char;
IP_MASK_STRING = array[1..16] of Char;
PIP_ADDR_STRING = ^TIP_ADDR_STRING;
TIP_ADDR_STRING = record
Next: PIP_ADDR_STRING;
IpAddress: IP_ADDRESS_STRING;
IpMask: IP_MASK_STRING;
Context: DWORD;
end;
PFIXED_INFO = ^TFIXED_INFO;
TFIXED_INFO = record
HostName: array[1..MAX_HOSTNAME_LEN + 4] of Char;
DomainName: array[1..MAX_DOMAIN_NAME_LEN + 4] of Char;
CurrentDnsServer: PIP_ADDR_STRING;
DnsServerList: TIP_ADDR_STRING;
NodeType: UINT;
ScopeId: array[1..MAX_SCOPE_ID_LEN + 4] of Char;
EnableRouting: UINT;
EnableProxy: UINT;
EnableDns: UINT;
end;
PMIB_IPADDRROW = ^TMIB_IPADDRROW;
TMIB_IPADDRROW = packed record
dwAddr: DWORD;
dwIndex: DWORD;
dwMask: DWORD;
dwBCastAddr: DWORD;
dwReasmSize: DWORD;
unused1: SmallInt;
wType: SmallInt;
end;
PMIB_IPADDRTABLE = ^TMIB_IPADDRTABLE;
TMIB_IPADDRTABLE = record
dwNumEntries: DWORD;
table: array[0..0] of TMIB_IPADDRROW;
end;
PMIB_IFROW = ^TMIB_IFROW;
TMIB_IFROW = record
wszName: array[1..MAX_INTERFACE_NAME_LEN] of WCHAR;
dwIndex: DWORD;
dwType: DWORD;
dwMtu: DWORD;
dwSpeed: DWORD;
dwPhysAddrLen: DWORD;
bPhysAddr: array[1..MAXLEN_PHYSADDR] of Byte;
dwAdminStatus: DWORD;
dwOperStatus: DWORD;
dwLastChange: DWORD;
dwInOctets: DWORD;
dwInUcastPkts: DWORD;
dwInNUcastPkts: DWORD;
dwInDiscards: DWORD;
dwInErrors: DWORD;
dwInUnknownProtos: DWORD;
dwOutOctets: DWORD;
dwOutUcastPkts: DWORD;
dwOutNUcastPkts: DWORD;
dwOutDiscards: DWORD;
dwOutErrors: DWORD;
dwOutQLen: DWORD;
dwDescrLen: DWORD;
bDescr: array[1..MAXLEN_IFDESCR] of Byte;
end;
function GetNetworkParams(FixedInfo: PFIXED_INFO; OutBufLen: PULONG): DWORD;
stdcall; external 'iphlpapi.dll' name 'GetNetworkParams';
function GetIpAddrTable(IpAddrTable: PMIB_IPADDRTABLE; pdwSize: PULONG;
Order: BOOL): DWORD; stdcall; external 'iphlpapi.dll' name 'GetIpAddrTable';
function GetIfEntry(pIfRow: PMIB_IFROW): DWORD;
stdcall; external 'iphlpapi.dll' name 'GetIfEntry';
function IpToStr(Ip: DWORD): string;
begin
Result:= Format('%d.%d.%d.%d',
[IP and $FF,(IP shr 8) and $FF,(IP shr 16) and $FF,(IP shr 24) and $FF]);
end;
function PhysAddrToStr(PhysAddr: PByte; Len: DWORD): string;
begin
Result:= EmptyStr;
while Len > 1 do
begin
Result:= Result + IntToHex(PhysAddr^,2) + '-';
inc(PhysAddr);
dec(Len);
end;
if Len > 0 then
Result:= Result + IntToHex(PhysAddr^,2);
end;
function IfTypeToStr(IfType: DWORD): string;
begin
case ifType of
MIB_IF_TYPE_ETHERNET: Result:= 'ETHERNET';
MIB_IF_TYPE_TOKENRING: Result:= 'TOKENRING';
MIB_IF_TYPE_FDDI: Result:= 'FDDI';
MIB_IF_TYPE_PPP: Result:= 'PPP';
MIB_IF_TYPE_LOOPBACK: Result:= 'LOOPBACK';
MIB_IF_TYPE_SLIP: Result:= 'SLIP';
else
Result:= EmptyStr;
end;
end;
function BoolToYesNo(Value: Boolean): string;
begin
if Value then
Result:= 'Si'
else
Result:= 'No';
end;
procedure Vamos;
var
FixedInfo: PFIXED_INFO;
OutBufLen: ULONG;
IpAddr: PIP_ADDR_STRING;
IfRow: TMIB_IFROW;
Table: PMIB_IPADDRTABLE;
Size: DWORD;
i: Integer;
begin
GetMem(FixedInfo,Sizeof(FixedInfo));
try
OutBufLen:= Sizeof(FixedInfo);
if GetNetworkParams(FixedInfo,@OutBufLen) = ERROR_BUFFER_OVERFLOW then
begin
FreeMem(FixedInfo);
GetMem(FixedInfo,OutBufLen);
end;
if GetNetworkParams(FixedInfo,@OutBufLen) = NO_ERROR then
begin
Writeln('--- Network parameters ---');
Writeln('Host name: ' + String(PChar(@FixedInfo.HostName)));
Writeln('Domain name: ' + String(PChar(@FixedInfo.DomainName)));
Writeln('DNS Servers:');
IpAddr:= @FixedInfo.DnsServerList;
while IpAddr <> nil do
begin
Writeln(#9 + String(PChar(@IpAddr.IpAddress)));
IpAddr:= IpAddr.Next;
end;
Writeln('Enable routing: ' + BoolToYesNo(Boolean(FixedInfo.EnableRouting)));
Writeln('Enable proxy: ' + BoolToYesNo(Boolean(FixedInfo.EnableProxy)));
Writeln('Enable DNS: ' + BoolToYesNo(Boolean(FixedInfo.EnableDNS)));
Writeln;
end;
finally
FreeMem(FixedInfo);
end;
GetMem(Table, Sizeof(TMIB_IPADDRTABLE));
try
Size:= Sizeof(TMIB_IPADDRTABLE);
if GetIpAddrTable(Table, @Size, FALSE) = ERROR_INSUFFICIENT_BUFFER then
begin
FreeMem(Table);
GetMem(Table,Size);
end;
FillChar(Table^,Size,0);
if GetIpAddrTable(Table, @Size, FALSE) = NO_ERROR then
begin
Writeln('--- Ip Address Table ---');
for i:= 0 to Table.dwNumEntries - 1 do
begin
with Table.table[i] do
begin
Writeln('Direccion IP: ' + IpToStr(dwAddr));
Writeln('Mascara: ' + IpToStr(dwMask));
end;
FillChar(IfRow,Sizeof(IfRow),0);
IfRow.dwIndex:= Table.table[i].dwIndex;
if GetIfEntry(@IfRow) = NO_ERROR then
with IfRow do
begin
Writeln('Interface:');
Writeln(#9 + 'Direccion MAC: ' + PhysAddrToStr(@bPhysAddr,dwPhysAddrLen));
Writeln(#9 + 'Tipo: ' + IfTypeToStr(dwType));
Writeln(#9 + 'MTU: ' + IntToStr(dwMTU));
Writeln(#9 + 'Speed: ' + IntToStr(dwSpeed) + ' bits/s');
Writeln(#9 + 'Recibidos: ' + IntToStr(dwInOctets) + ' Bytes');
Writeln(#9 + 'Enviados: ' + IntToStr(dwOutOctets) + ' Bytes');
Writeln(#9 + 'Descripcion: ' + Copy(String(PChar(@bDescr)),1,50));
end;
Writeln;
end;
end;
finally
FreeMem(Table);
end;
end;
begin
Vamos;
Writeln('Pulsa "enter" para terminar ...');
Readln;
end.
Un ejemplo de lo que muestra este programa:
Código:
--- Network parameters ---
Host name: equipo01
Domain name:
DNS Servers:
80.58.61.250
80.58.61.254
Enable routing: No
Enable proxy: No
Enable DNS: No
--- Ip Address Table ---
Direccion IP: 192.168.1.4
Mascara: 255.255.255.0
Interface:
Direccion MAC: 00-02-33-49-5F-90
Tipo: ETHERNET
MTU: 1500
Speed: 100000000 bits/s
Recibidos: 8826165 Bytes
Enviados: 1653809 Bytes
Descripcion: SURECOM EP-320X-S 100/10M Ethernet PCI Adapter
Direccion IP: 127.0.0.1
Mascara: 255.0.0.0
Interface:
Direccion MAC:
Tipo: LOOPBACK
MTU: 1520
Speed: 10000000 bits/s
Recibidos: 630 Bytes
Enviados: 630 Bytes
Descripcion: MS TCP Loopback interface
Pulsa "enter" para terminar...