Un lugar de encuentro para los programadores de habla hispana

Un lugar de encuentro para los programadores de habla hispana

Buscar

Entrar

Puedes acceder utilizando tu cuenta de usuario del foro.

Si no dispone de cuenta, puede crear una accediendo al formulario de registro del foro.



Obtener la dirección IP y la MAC Imprimir
Ideas - Delphi

La función NetBios(), cuyo prototipo y estructuras asociadas se encuentran en el módulo Nb30, permite ejecutar diferentes comandos de servicios de red, entre ellos uno, llamado NCBASTAT, que permite obtener distinta información acerca del estado y configuración de los adaptadores.

Para poder recuperar la dirección MAC, que es lo que interesa, básicamente hay que preparar una estructura TNcb, con los parámetros apropiados, y a continuación llamar a NetBios() para obtener la información. En este caso habría que facilitar el número de adaptador, un nombre y la dirección y longitud de un bloque de memoria en el que se devolverá el resultado. Tras la llamada, el miembro adapter_address, que es una matriz de seis elementos, contendrá los bytes que identifican a la tarjeta.

Para obtener la dirección IP propia, lo más fácil, es usar las funciones Windows sockets. Básicamente se llama a gethostname(), para obtener el nombre de nuestro ordenador, y a continuación a gethostbyname(), que devuelve una estructura de datos en las que están contenidas las direcciones IP. Para convertir esas direcciones, que están almacenadas en cuatro bytes, en una cadena, lo más simple es usar la función inet_ntoa(). Todas estas funciones están documentadas en la API de Windows.

En este ejemplo, al pulsar un botón en el formulario, se obtiene y muestra tanto la dirección MAC como la IP. Para mantener la simplicidad tan sólo se obtiene la primera dirección de cada tipo, pero bastaría un bucle para recuperar otras que pudieran existir en caso de que el sistema contase con varios adaptadores.

 
uses Nb30, Winsock;
 
procedure TForm1.Button1Click(Sender: TObject);
  type
   // Una estructura que une el estado del adaptador
   // con una matriz de estructuras TNameBuffer
  ASTAT = record
    adapt: TAdapterStatus;
    NameBuff: Array[0..29] Of TNameBuffer;
  end;
  var
    Adaptador: ASTAT;
    Ncb: TNCB;
    Nombre: String;
    DatosSocket: WSAData;
    BloqueIP: PHostEnt;
    DirIP: in_addr;
begin
  with Ncb Do // Inicializamos la estructura para ejecutar
    begin // el comando NCBSTAT
      ncb_command := char(NCBASTAT);
      ncb_lana_num := char(0); // asumimos que sólo hay un adaptador
      ncb_callname := '*'; // y no facilitamos nombre
      ncb_buffer := @Adaptador; // dirección de la estructura para obtener
      ncb_length := sizeof(Adaptador); // los datos devueltos
    end;
 
    Netbios(@Ncb); // Llamada a NetBios
 
    // Mostramos los datos
    with Adaptador.adapt Do
      ShowMessage('La dirección MAC es: ' +
         IntToHex(Integer(adapter_address[0]), 2) +
         IntToHex(Integer(adapter_address[1]), 2) +
         IntToHex(Integer(adapter_address[2]), 2) +
         IntToHex(Integer(adapter_address[3]), 2) +
         IntToHex(Integer(adapter_address[4]), 2) +
         IntToHex(Integer(adapter_address[5]), 2));
 
    WSAStartup($0101, DatosSocket); // Inicializamos Windows sockets
    SetLength(Nombre, MAX_PATH); // y obtenemos el nombre de nuestro equipo
    gethostname(PChar(Nombre), MAX_PATH);
       // que usamos para obtener un bloque de información sobre IP
    BloqueIP := gethostbyname(PChar(Nombre));
       // del cual recuperamos la dirección
    CopyMemory(@DirIP, (BloqueIP^).h_addr_list^, BloqueIP.h_length);
    ShowMessage(inet_ntoa(DirIP)); // y la mostramos
 end;
 
 
Comentarios (0)
Para escribir un comentario debes estar registrado