PDA

Ver la Versión Completa : Dir IP, Mask y Gateway


yorki
11-10-2006, 21:41:27
Hola soy nuevo en el foro y estoy buscando ayuda respecto a como obtener la configuracion IP de mi PC en variables String por separado.
Si, he buscado en el foro, pero solo puedo llegar a la dir IP, pero necesito ademas la mascara y el gateway. Esto es para hacer una pequeña aplicacion que cambie la configuracion IP de la PC y que el usuario mediante un boton pueda saber que configuración tiene en un momento determinado.
Gracias

yorki

seoane
12-10-2006, 00:53:33
Por ahora te dejo un ejemplo de como obtener la ip, la mascara, la MAC y la descripción del interface. La Gateway te la dejo a ti:

Es una aplicación de consola:

program ipview;

{$APPTYPE CONSOLE}

uses Windows, SysUtils;

const
MAX_INTERFACE_NAME_LEN = 256;
MAXLEN_PHYSADDR = 8;
MAXLEN_IFDESCR = 256;

type
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 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 > 0 do
begin
Result:= Result + IntToHex(PhysAddr^,2);
inc(PhysAddr);
dec(Len);
end;
end;

procedure Ejemplo;
var
IfRow: TMIB_IFROW;
Table: PMIB_IPADDRTABLE;
Size: DWORD;
i: Integer;
begin
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
for i:= 0 to Table.dwNumEntries - 1 do
begin
FillChar(IfRow,Sizeof(IfRow),0);
IfRow.dwIndex:= Table.table[i].dwIndex;
if GetIfEntry(@IfRow) = NO_ERROR then
with IfRow do
begin
Writeln('Descripcion: ' + Copy(String(PChar(@bDescr)),1,dwDescrLen));
Writeln('Physical address: ' + PhysAddrToStr(@bPhysAddr,dwPhysAddrLen));
end;
with Table.table[i] do
begin
Writeln('Address: ' + IpToStr(dwAddr));
Writeln('Mask: ' + IpToStr(dwMask));
Writeln;
end;
end;
end;
finally
FreeMem(Table);
end;
end;

begin
Ejemplo;
Writeln('Pulsa una <enter> para terminar ...');
Readln;
end.

yorki
12-10-2006, 15:18:30
Bueno primero que nada muchas gracias a seoane por su ayuda.
Ahora, ya se que corro el riesgo de que nadie mas me responda o me tire un cabo como decimos los cubanos, pero recien empiezo a dar mis primeros pasos en delphi y si no es molestia me gustaria ver si podian darme un norte de como funciona la aplicación, que de echo la probe y me cuadró bastante, aunque la necesitaria hacer en una ventana de windows, pero quisiera saber un poco al respecto. Si tuvieran algun enlace o pdf, o cualquier documentacion con la cual romperme los sesos y poder adentrarme mas en este mundo, sobre todo en lo que respecta a hacer cosas como estas de la Configuracion IP, es decir cosas con el sistema operativo. He oido que esto es mediante las API, pero estoy en pañales.
Saludos
yorki

seoane
12-10-2006, 17:59:48
Veo que no te asusta leer, eso esta bien, mucha gente quiere que le den todo hecho. Lamentablemente la mayoría de información sobre el tema esta en C, y si no estas familiarizado con este lenguaje y con delphi, puede resultarte complicado traducir las funciones y estructuras. De todas formas aquí te dejo algo para leer, es la pagina de microsoft sobre la API iphelper, que es la que se encarga de manejar todo esto.

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/iphlp/iphlp/ip_helper_start_page.asp

Echale un vistazo, y para cualquier duda aquí estamos :)