Nota del autor

Si la entrada que estás leyendo carece de imágenes, no se ve el vídeo que teóricamente lleva incrustado o el código fuente mostrado aparece sin formato, podéis conocer los motivos aquí. Poco a poco iré restableciendo la normalidad en el blog.
Este blog es un archivo de los artículos situados previamente en Lobosoft.es y ha dejado de ser actualizado. Las nuevas entradas pueden encontrarse en www.lobosoft.es. Un saludo,
Lobosoft.

martes, 18 de enero de 2011

Conocer la MAC de un equipo remoto

Aunque me propuse, tras llevar a cabo el borrón y cuenta nueva de Lobosoft, que los cambios en el mismo fueran profundos, llevando a cabo un cambio en el tratamiento que daría a los contenidos y desligando estos -hasta cierto punto al menos- del desarrollo de software, lo cierto es que han transcurrido los meses y no he contado con todo el tiempo que habría deseado y, en último término, necesitado, para escribir en él cuanto tenía previsto. Además de eso, en el fondo un servidor es un enamorado de la tecla, y es por ello que he decidido dejar paso al software en el blog, no ya como antaño, con listados de código de mayor o menor extensión, mas sí al menos con pequeñas “píldoras” que solucionan los pequeños retos con los que en ocasiones nos encontramos. Inauguro la sección con una clase de apenas 16 líneas que, para más inri, únicamente se ocupa de llevar a cabo una llamada mediante interoperabilidad a una función de la API IP Helper de Microsoft.

Un compañero de trabajo se preguntaba cómo conocer la dirección física (MAC) del dispositivo de red de una máquina ajena al ordenador donde se ejecutaría la aplicación que estaba desarrollando. El programa en cuestión debería conocer la MAC del mismo para llevar a cabo una serie de comprobaciones y no sería posible solicitarlo a ninguna aplicación de la misma ya que esta únicamente incorporaría un firmware con capacidades bastante acotadas. Está claro que, encontrándose conectados dentro de la misma red, ambos equipos podrían verse y, por tanto, sería posible usar el protocolo ARP (Address Resolution Protocol) para localizarla.

Refrescando nuestros conocimientos de redes, el protocolo de resolución de direcciones, ARP, permite enviar un paquete de solicitud (ARP request) a la dirección de difusión de nuestra red (broadcast) con la dirección IP en la que estamos interesados. Ya sea la máquina que buscamos, u otra de la red que posea información sobre ella en su caché, responderá (ARP reply) con la dirección Ethernet que buscamos. Esto, explicado de forma un tanto básica (para saber más, podéis consultar el RFC 826, donde está documentado el protocolo ARP).

Desde la consola de comandos es posible usar el comando arp.exe para visualizar la tabla de conversiones entre direcciones IP y físicas actualmente disponible en nuestro equipo. En la siguiente imagen se muestra una solicitud de este tipo, aunque es posible localizar la entrada correspondiente a una determinada dirección IP simplemente indicándola tras el comando; por ejemplo, mediante

arp –a 192.168.0.1


Siendo así resulta fácil interpretar que podemos llevar a cabo esa solicitud desde nuestro código. En el caso de .NET, la forma más rápida de hacerlo es invocando directamente a la función SendARP() de la API IP Helper (librería iphlpapi.dll). El código de ejemplo que incluyo simplemente hace eso: recibe la IP sobre la que queremos recabar información de la consola, la convierte a UInt32, ya que es el tipo que recibe SendARP() –aunque podríamos haber recuperado ese valor de la propiedad IPAddress, habiendo convertido previamente la cadena con la dirección IP a un objeto de tipo IPAddress, lo cierto es que dicha propiedad está obsoleta desde hace bastante tiempo y Microsoft desaconseja usarla-, y realizamos la llamada a la API. Esta nos devolverá, si es capaz de recuperarla, la MAC correspondiente a la IP en cuestión. Y ya, simplemente, nos quedará mostrar la información sobre esa dirección física del modo adecuado.


Sencillo, ¿verdad?