Ir al contenido



Foto

¿Cómo sacar la dirección fí­sica de un equipo a través del IP con Delphi?


16 respuestas en este tema

#1 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.409 mensajes
  • LocationRepública Dominicana

Escrito 13 marzo 2009 - 09:43

Pues eso, ¿cómo saco esa información de un equipo a través del IP con delphi?, ejemplo, usando la ventana de comando de DOS tecleo lo siguiente:



delphi
  1. C:\Documents and Settings\fleonor>arp -a 143.1.14.202



Y obtengo lo siguiente:



delphi
  1. Interface: 143.1.14.37 --- 0x2
  2.   Internet Address      Physical Address      Type
  3.   143.1.14.202          00-17-61-01-96-bc    dynamic



esas informaciones la quiero sacar desde delphi y presentarlo en un Memo o Labels. ¿Se puede?.

Saludos.
  • 0

#2 Rolphy Reyes

Rolphy Reyes

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.092 mensajes
  • LocationRepública Dominicana

Escrito 13 marzo 2009 - 11:28

Saludos.

Enecumene mira este enlace a ver si te sirve.
  • 0

#3 seoane

seoane

    Advanced Member

  • Administrador
  • 1.249 mensajes
  • LocationEspaña

Escrito 13 marzo 2009 - 04:06

Bueno, lo acabo de hacer, asi que puede que tenga algun fallo:


delphi
  1. uses winsock;
  2.  
  3. type
  4.   PULONG = ^ULONG;
  5.  
  6. function SendARP(DestIP,SrcIP: in_addr; pMacAddr,PhyAddrLen: PULONG): DWORD;
  7.   stdcall; external 'iphlpapi.dll' name 'SendARP';
  8.  
  9.  
  10. function ObtenerMAC(IP: String): String;
  11. var
  12.   i: Integer;
  13.   dwRetVal: DWORD;
  14.   DestIp, SrcIp: in_addr;
  15.   MacAddr: array[0..1] of ULONG;
  16.   PhysAddrLen: ULONG;
  17.   PhysAddr: PByte;
  18. begin
  19.     DestIp.S_addr:= 0;
  20.     SrcIp.S_addr:= 0;
  21.     PhysAddrLen:= 6;
  22.     DestIp.S_addr:= inet_addr(PChar(IP));
  23.  
  24.     dwRetVal:= SendARP(DestIp, SrcIp, @MacAddr, @PhysAddrLen);
  25.  
  26.     Result:= EmptyStr;
  27.     if dwRetVal = NO_ERROR then
  28.     begin
  29.       PhysAddr:= PByte(@MacAddr);
  30.       for i := 1 to Sizeof(MacAddr)-2 do
  31.       begin
  32.         if Result= EmptyStr then
  33.           Result:= IntToHex(PhysAddr^,2)
  34.         else
  35.           Result:= Result + '-' + IntToHex(PhysAddr^,2);
  36.         inc(PhysAddr);
  37.       end;
  38.     end;
  39. end;
  40.  
  41. // Por ejemplo
  42. ShowMessage(ObtenerMAC('143.1.14.202'));


  • 0

#4 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.409 mensajes
  • LocationRepública Dominicana

Escrito 13 marzo 2009 - 04:56

Gracias seoane, ahorita lo pruebo (y).

Saludos.
  • 0

#5 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.040 mensajes
  • LocationMéxico

Escrito 13 marzo 2009 - 05:28

Anda, funciona muy bien amigo seaone, solo vi que agrega dos valores mas a la MAC :D

Salud OS
  • 0

#6 seoane

seoane

    Advanced Member

  • Administrador
  • 1.249 mensajes
  • LocationEspaña

Escrito 14 marzo 2009 - 06:54

Anda, funciona muy bien amigo seaone, solo vi que agrega dos valores mas a la MAC :D


No pasáis una. Así­ me gusta que estéis atentos  :D

Corregido !
  • 0

#7 escafandra

escafandra

    Advanced Member

  • Moderadores
  • PipPipPip
  • 3.893 mensajes
  • LocationMadrid - España

Escrito 05 julio 2012 - 05:29

¡Caramba!, el código de seoane.

Saludos.
  • 0

#8 seoane

seoane

    Advanced Member

  • Administrador
  • 1.249 mensajes
  • LocationEspaña

Escrito 06 julio 2012 - 12:08

¡Caramba!, el código de seoane.


Y lo peor es que no lo saben usar !!! me estan poniendo malo  :s

Por si a alguien le interesa:


delphi
  1. DestIp.S_addr:= inet_addr(PAnsiChar(AnsiString(IP)));


* Los typecast no se pueden hacer "a lo loco" hay que saber como se hacen y porque

Que agusto me he quedado !!!  <:o)


  • 0

#9 cadetill

cadetill

    Advanced Member

  • Moderadores
  • PipPipPip
  • 994 mensajes
  • LocationEspaña

Escrito 06 julio 2012 - 01:08

Lo peor de todo es que no ponen la fuente

Bien por la aclaración seoane ;)

  • 0

#10 barakuda

barakuda

    Newbie

  • Miembros
  • Pip
  • 2 mensajes
  • LocationEspaña

Escrito 06 julio 2012 - 02:20

Lo peor de todo es que no ponen la fuente

Bien por la aclaración seoane ;)

No puse la fuente por "represalias" a que no quisieran ayudarme a comprender el código, por ser este, de una web de "la competencia".
No poste en este foro, por que dada la ultima modificación:

Publicado por: seoane
« en: 14 de Marzo de 2009, 06:54:28 »
... no quería "revivir" post antiguos

esta claro que me equivoque en todo, pido disculpas al autor del código pero no pido disculpas por querer aprender de cualquier código libre que aya en cualquier foro.

un saludo

PD: seoane, gracias nuevamente por aclarar mi duda y mostrarme la solución, ahora ya me funciona perfectamente, un saludo.
  • 0

#11 escafandra

escafandra

    Advanced Member

  • Moderadores
  • PipPipPip
  • 3.893 mensajes
  • LocationMadrid - España

Escrito 06 julio 2012 - 03:54

No puse la fuente por "represalias" a que no quisieran ayudarme a comprender el código, por ser este, de una web de "la competencia".
No poste en este foro, por...
... no quería "revivir" post antiguos


No creo que en CD no quieran ayudarte por decir la fuente. DA y CD no son enemigos. Muchos usuarios visitamos y publicamos en ambos.

La fuente siempre se debe respetar,  esto, junto con el agradecimiento, es la mínima compensación al esfuerzo altruista de su autor.

Tranquilo todos nos equivocamos. :)


Saludos.
  • 0

#12 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.280 mensajes
  • LocationArgentina

Escrito 06 julio 2012 - 08:01

En algunas de mis units yo tengo algunos "disclamers" y aclaraciones sobre código que no es mío sino una conceptualización de ideas y propuestas de otros. Como por ejemplo:

1.1 26/12/2006 - 11:53 am
    Mejoras implementadas basadas en Scanline(). Alternativa propuesta por
    seoane. Para mayor referencia. Dirijirse a: http://www.clubdelphi.om/foros/
    showtreath?=


Saludos,
  • 0

#13 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.040 mensajes
  • LocationMéxico

Escrito 06 julio 2012 - 08:16

Hola barakuda, bienvenido a DelphiAccess.

No puse la fuente por "represalias" a que no quisieran ayudarme a comprender el código, por ser este, de una web de "la competencia".


Es clara la percepción que se tiene al respecto de CD y DA, pero la realidad a demostrado que es infundada.

No poste en este foro, por que dada la ultima modificación.......


A veces es necesario revivir publicaciones y eso enriquece el contenido del foro, pero si te place puedes abrir un nuevo tema y hacer referencia al tema origen, es lo único que se pide en cualquier foro, bitácora, etc.

Es decir, no es un tema de derechos de autor, es un tema de correspodencia. La formula es muy simple, "Se dá y se agradece"

Saludos

  • 0

#14 cadetill

cadetill

    Advanced Member

  • Moderadores
  • PipPipPip
  • 994 mensajes
  • LocationEspaña

Escrito 06 julio 2012 - 02:52

En algunas de mis units yo tengo algunos "disclamers" y aclaraciones sobre código que no es mío sino una conceptualización de ideas y propuestas de otros.


Yo hago lo mismo que tu. De hecho, si miráis el código de la GMLib, vereis varias referencias a delphi.about y creo que alguna a stackoverflow.com :)

Nos leemos

  • 0

#15 barakuda

barakuda

    Newbie

  • Miembros
  • Pip
  • 2 mensajes
  • LocationEspaña

Escrito 06 julio 2012 - 07:37

Ya me funciono, hay partes del código que no controlo a si que me toca "romperlas"  8o|  y estudiarlas :(

gracias por la ayuda
un saludo !
  • 0

#16 escafandra

escafandra

    Advanced Member

  • Moderadores
  • PipPipPip
  • 3.893 mensajes
  • LocationMadrid - España

Escrito 07 julio 2012 - 10:58

Aprovechando la reapertura del tema y consciente de que puede ser de interés, voy a dar mi versión en C/C++:

cpp
  1. #include <winsock2.h>
  2. #include <Iphlpapi.h>
  3. #pragma comment(lib, "iphlpapi.lib")
  4.  
  5.  
  6. void ObtenerMAC(char* IP)
  7. {
  8.   DWORD dwRetVal;
  9.   in_addr DestIp, SrcIp;
  10.   BYTE MacAddr[6];
  11.   ULONG PhysAddrLen = sizeof(MacAddr);
  12.   SrcIp.S_un.S_addr = 0;
  13.   DestIp.S_un.S_addr = inet_addr(IP);
  14.  
  15.   char Buffer[20] = "Error en IP";
  16.   if(DestIp.S_un.S_addr != INADDR_NONE){
  17.     if(SendARP(*(ULONG*)&DestIp, *(ULONG*)&SrcIp, (PULONG)MacAddr, &PhysAddrLen) == NO_ERROR){
  18.       wsprintf(Buffer, "%.2X-%.2X-%.2X-%.2X-%.2X-%.2X", MacAddr[0], MacAddr[1], MacAddr[2], MacAddr[3], MacAddr[4], MacAddr[5]);
  19.     }
  20.   }
  21.   MessageBox(0, Buffer, "MAC", 0);
  22. }

Y se usa de esta manera:

cpp
  1. ObtenerMAC("192.168.1.34")


Saludos.
  • 0

#17 JoAnCa

JoAnCa

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 741 mensajes
  • LocationPinar del Río, Cuba

Escrito 13 febrero 2017 - 03:06

Y aqui estoy volviendo a reanimar un post antiguo *-)

 

Pues con esta solucion me funciona perfecto dentro de mi red local, pero no así en mis otras subredes

 

Como se podria modificar el código, o de que otra manera hacer que me devuelva la MAC de otras PC ubicadas en otras subredes pertencientes a mi WAN

 

 


  • 0



Responder en este tema