Ir al contenido


Foto

GetCurrentIP


  • Por favor identifícate para responder
3 respuestas en este tema

#1 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 20 enero 2015 - 02:30

A veces es interesante saber la IP de nuestro equipo en red local, una forma sencilla de averiguarlo es esta:


delphi
  1. type
  2.   PIN_ADDR = ^in_addr;
  3. function GetCurrentIP: String;
  4. var
  5.   Wsa: WSADATA;
  6.   Name: array[0..255] of char;
  7.   hostinfo: PHOSTENT;
  8. begin
  9.   Result:= '';
  10.   FillChar(Wsa, SizeOf(WSAData), 0);
  11.   if WSAStartup(MAKEWORD(2, 2), Wsa) = 0 then
  12.   begin
  13.     if gethostname(Name, SizeOf(Name)) = 0 then
  14.     begin
  15.       hostinfo:= gethostbyname(Name);
  16.       if hostinfo <> nil then
  17.         Result:=  inet_ntoa(PIN_ADDR(hostinfo^.h_addr_list^)^);
  18.     WSACleanup;
  19.     end;
  20.   end;
  21. end;



El problema aparece si tenemos más de una tarjeta de red física o virtual, como es el caso de tener instaladas máquinas virtuales en nuestro PC. Para solucionar este caso propongo esta función:


delphi
  1. uses
  2.   SysUtils, Windows, WinSock;
  3.  
  4. type
  5.  
  6. PIP_ADDR_STRING = ^IP_ADDR_STRING;
  7. IP_ADDR_STRING = record
  8.   Next: PIP_ADDR_STRING;
  9.   IpAddress: array [0..15] of Char;
  10.   IpMask: array [0..15] of Char;
  11.   Context: DWORD;
  12. end;
  13.  
  14. PIP_ADAPTER_INFO = ^IP_ADAPTER_INFO;
  15. IP_ADAPTER_INFO = record
  16.   Next: PIP_ADAPTER_INFO;
  17.   ComboIndex: DWORD;
  18.   AdapterName: array [0..259] of Char;
  19.   Description: array [0..131] of Char;
  20.   AddressLength: UINT;
  21.   Address: array [0..7] of BYTE;
  22.   Index: DWORD;
  23.   Type_: UINT;
  24.   DhcpEnabled: UINT;
  25.   CurrentIpAddress: PIP_ADDR_STRING;
  26.   IpAddressList: IP_ADDR_STRING;
  27.   GatewayList: IP_ADDR_STRING;
  28.   DhcpServer: IP_ADDR_STRING;
  29.   HaveWins: BOOL;
  30.   PrimaryWinsServer: IP_ADDR_STRING;
  31.   SecondaryWinsServer: IP_ADDR_STRING;
  32.   LeaseObtained: Longint;
  33.   LeaseExpires: Longint;
  34. end;
  35.  
  36. function GetAdaptersInfo(pAdapterInfo: PIP_ADAPTER_INFO; var pOutBufLen: ULONG): DWORD; stdcall; external 'iphlpapi.dll';
  37.  
  38. function GetCurrentIP: String;
  39. var
  40.   pAI: PIP_ADAPTER_INFO;
  41.   AILen: DWORD;
  42. begin
  43.   // Encuentro la IP
  44.   GetAdaptersInfo(nil, AILen);
  45.   GetMem(pAI, AILen);
  46.   if GetAdaptersInfo(pAI, AILen) = 0 then
  47.     Result:= pAI.IpAddressList.IpAddress;
  48.   FreeMem(pAI);
  49. end;



La potente API GetAdaptersInfo es un verdadero "ipconfig" de la que podemos extraer muchos más datos.  Os propongo esta pequeña aplicación que muestra el nombre del equipo, la IP y la MAC:


delphi
  1. program GeCurrent_IP_MAC;
  2.  
  3.  
  4. uses
  5.   SysUtils, Windows, WinSock;
  6.  
  7. type
  8.  
  9. PIP_ADDR_STRING = ^IP_ADDR_STRING;
  10. IP_ADDR_STRING = record
  11.   Next: PIP_ADDR_STRING;
  12.   IpAddress: array [0..15] of Char;
  13.   IpMask: array [0..15] of Char;
  14.   Context: DWORD;
  15. end;
  16.  
  17. PIP_ADAPTER_INFO = ^IP_ADAPTER_INFO;
  18. IP_ADAPTER_INFO = record
  19.   Next: PIP_ADAPTER_INFO;
  20.   ComboIndex: DWORD;
  21.   AdapterName: array [0..259] of Char;
  22.   Description: array [0..131] of Char;
  23.   AddressLength: UINT;
  24.   Address: array [0..7] of BYTE;
  25.   Index: DWORD;
  26.   Type_: UINT;
  27.   DhcpEnabled: UINT;
  28.   CurrentIpAddress: PIP_ADDR_STRING;
  29.   IpAddressList: IP_ADDR_STRING;
  30.   GatewayList: IP_ADDR_STRING;
  31.   DhcpServer: IP_ADDR_STRING;
  32.   HaveWins: BOOL;
  33.   PrimaryWinsServer: IP_ADDR_STRING;
  34.   SecondaryWinsServer: IP_ADDR_STRING;
  35.   LeaseObtained: Longint;
  36.   LeaseExpires: Longint;
  37. end;
  38.  
  39. function GetAdaptersInfo(pAdapterInfo: PIP_ADAPTER_INFO; var pOutBufLen: ULONG): DWORD; stdcall; external 'iphlpapi.dll';
  40. function wsprintf(lpOut, lpFmt: PChar): Integer; cdecl; varargs; external 'User32.dll' name 'wsprintfA';
  41.  
  42. function GetCurrentIP_MAC(var Name: String; var IP: String; var MAC: String): boolean;
  43. var
  44.   Wsa: WSADATA;
  45.   pAI: PIP_ADAPTER_INFO;
  46.   AILen: DWORD;
  47.   Buff: array [0..255] of char;
  48. begin
  49.   Result:= true;
  50.   // Encuentro el nombre del equipo
  51.   if WSAStartup(MAKEWORD(2,2), Wsa) = 0 then
  52.   begin
  53.     gethostname(Buff, sizeof(Buff));
  54.     Name:= Buff;
  55.     WSACleanup;
  56.   end
  57.   else Result:= Result and false;
  58.  
  59.   // Encuentro la IP y la MAC
  60.   GetAdaptersInfo(nil, AILen);
  61.   GetMem(pAI, AILen);
  62.   if GetAdaptersInfo(pAI, AILen) = 0 then
  63.   begin
  64.     wsprintf(Buff, '%.2X-%.2X-%.2X-%.2X-%.2X-%.2X', pAI.Address[0], pAI.Address[1], pAI.Address[2], pAI.Address[3], pAI.Address[4], pAI.Address[5]);
  65.     MAC:= Buff;
  66.     IP:= pAI.IpAddressList.IpAddress;
  67.   end
  68.     else Result:= Result and false;
  69.  
  70.   FreeMem(pAI);
  71. end;
  72.  
  73.  
  74. var
  75.   Name, IP, MAC: String;
  76. begin
  77.   GetCurrentIP_MAC(Name, IP, MAC);
  78.   MessageBox(0, PCHAR(Name + #10 + #10 + 'IP:      ' + IP + #10 + 'MAC: ' + MAC + #10), 'Current IP', MB_OK or MB_ICONINFORMATION);
  79. end.




Saludos.
  • 0

#2 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 20 enero 2015 - 02:55

Caramba!!!

Muy interesante idea (y)  (b)

Saludos
  • 0

#3 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4.945 mensajes
  • LocationMéxico

Escrito 20 enero 2015 - 04:13

Fenomenal.. Esto va para las redes sociales. Gracias por compartir esto amigo.
  • 0

#4 ELKurgan

ELKurgan

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 566 mensajes
  • LocationEspaña

Escrito 21 enero 2015 - 12:33

(y) :ap:
  • 0




IP.Board spam blocked by CleanTalk.