Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Enviar direccion MAC a un servidor

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Enviar direccion MAC a un servidor Responder citando

Hola a todos. A ver si alguien sabe como puedo resolver el siguiente problema.

Estoy haciendo mi proyecto fin de carrera. estoy desarrollando un programa de libre distribucion y uso para que simula un PLC de Siemens. Con fines estadisticos y para saber la repercusion del programa y el uso quiero hacer un modulo que haga lo siguiente.

1) Enviar un identificador desde el ordenador desde que se esta utilizando el programa hacia por ejemplo una web o base de datos situada en un servidor.

En principio se habia pensado en enviar una IP, pero debido a que hay IPs que no son fijas pense en utilizar la direccion MAC de la tarjeta de red, debido a que esta es unica.
Estuve mirando funciones de Winsock y encontre para enviar el nombre del equipo o la IP, pero ninguna para la MAC.

La segunda parte es enviar esta informacion hacia 'algun sitio' y mi problema es que no se ni como ni hacia donde es el mejor sitio. Dispongo de servidores en la univerisdad donde lo podria enviar, e incluso paginas web.

Agradeceria cualquier tipo de ayuda.

Lo estoy desarrollando en Borland Builder 4

Gracias


***************EDICION****************
Este es un codigo que compila y da la mac del equipo en que se ejecuta.

Código:

#pragma hdrstop
#include <condefs.h>
#include <iostream.h>

   #include <windows.h>
   #include <wincon.h>
   #include <stdlib.h>
   #include <stdio.h>
   #include <time.h>
   #include <mbstring.h>


   typedef struct _ASTAT_
   {

      ADAPTER_STATUS adapt;
      NAME_BUFFER    NameBuff [30];

   }ASTAT, * PASTAT;

   ASTAT Adapter;

//---------------------------------------------------------------------------
#pragma argsused
void main(int argc, char* argv[])
{

NCB Ncb;
      UCHAR uRetCode;
      char NetName[50];
      LANA_ENUM   lenum;
      int      i;

      memset( &Ncb, 0, sizeof(Ncb) );
      Ncb.ncb_command = NCBENUM;
      Ncb.ncb_buffer = (UCHAR *)&lenum;
      Ncb.ncb_length = sizeof(lenum);
      uRetCode = Netbios( &Ncb );
      printf( "The NCBENUM return code is: 0x%x \n", uRetCode );

      for(i=0; i < lenum.length ;i++)
      {
          memset( &Ncb, 0, sizeof(Ncb) );
          Ncb.ncb_command = NCBRESET;
          Ncb.ncb_lana_num = lenum.lana[i];

          uRetCode = Netbios( &Ncb );
          printf( "The NCBRESET on LANA %d return code is: 0x%x \n",
                  lenum.lana[i], uRetCode );

          memset( &Ncb, 0, sizeof (Ncb) );
          Ncb.ncb_command = NCBASTAT;
          Ncb.ncb_lana_num = lenum.lana[i];

          _mbscpy( Ncb.ncb_callname,  "*               " );
          Ncb.ncb_buffer = (char *) &Adapter;
          Ncb.ncb_length = sizeof(Adapter);

          uRetCode = Netbios( &Ncb );
          printf( "The NCBASTAT on LANA %d return code is: 0x%x \n",
                  lenum.lana[i], uRetCode );
          if ( uRetCode == 0 )
          {
      //       cout << "The Ethernet Number on LANA " << lenum.lana[i] <<" is: " << Integer (Adapter.adapt.adapter_address[0]) <<   ":"  << Adapter.adapt.adapter_address[1]  <<         ":"  <<           Adapter.adapt.adapter_address[2] <<       ":"  <<             Adapter.adapt.adapter_address[3] <<     ":"  <<                Adapter.adapt.adapter_address[4] <<      ":"  <<             Adapter.adapt.adapter_address[5] << endl;

      printf( "The Ethernet Number is: %02x:%02x:%02x:%02x:%02x:%02x\n",
                  Adapter.adapt.adapter_address[0],
                  Adapter.adapt.adapter_address[1],
                  Adapter.adapt.adapter_address[2],
                  Adapter.adapt.adapter_address[3],
                  Adapter.adapt.adapter_address[4],
                  Adapter.adapt.adapter_address[5] );

          }
       }
           system("PAUSE");
   }




Ahora otra duda sobre lo mismo.

Segun mis nociones teoricas de redes, cuando se envia un paquete por la red, con el viajan 6 datos:
IP`s origen y destino
Puertos origen y destino
y....
MAC origen y destino.


en la estructura sockaddr_in

Código:
 
struct sockaddr_in {       
 short int          sin_family;  // familia de direcciones, AF_INET       
unsigned short int sin_port;    // Número de puerto       
struct in_addr     sin_addr;    // Dirección de Internet       
unsigned char      sin_zero[8]; // Relleno para preservar el tamaño original de struct sockaddr    };


de la cual se podria obtener la IP con algo como...
Código:

        printf("Se obtuvo una conexión desde %s\n", inet_ntoa(client.sin_addr) );
 


o el puerto consultando sin_port

Ahora bien. Alguien sabe como conseguir la MAC de una manera similar?


Ultima edición por titomac el Lun 05 Jun, 2006 9:55 pm, editado 1 vez
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

https://cppbuilder.es/viewtopic.php?t=10270&highlight=mac

Ahi tienes funciones para sacar la mac.

Tambien con el comando arp puedes sacar la mac.

Un saludo.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Muchas gracias por tu respuesta.
Primera parte superada Smile
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Tengo una pregunta...

Exactamente que tipo de simulacion haces con el PLC?

Yo hize una simulacion pero con las señales de salida y entrada del automata pero es por curiosidad....


Un saludo.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Pues cargando el programa de control puedo controlar una planta virtual.

No se si me explico muy bien. Si estas interesado te puedo mandar la web para descargar tanto el simulador de plantas como el del plc

Un saludo.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Entonces hicistes algo parecido, yo lo hize con .net pq me daba problemas con el tipo variant.

Como resolvistes las llamadas con variant?


Un saludo.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Pasate tb la direccion para q le eche un vistazo.


Un saludo......
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

http://isa.uniovi.es/genia/spanish/download/index.htm
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Edite mi mensaje, a ver si alguien me puede echar un cable con la funcion que saca la mac, porque supongo que tiene que estar guardada en alguna estructura al igual que la ip y el puerto.

Cuando digo 'supongo' es por la poca teoria de redes que se.

Gracias
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Código:

// ESTRUCTURA PARA LA MAC-ADDRESS
typedef struct _ASTAT
{
  ADAPTER_STATUS  adapt;
  NAME_BUFFER  NameBuff[30];
} ASTAT;





AnsiString __fastcall GetMac()
{
    AnsiString slMacAddress;
    int ilRetVal;
    NCB stNetCtrlBlock;
    LPVOID pASTAT;
    ASTAT stAdapterStatus;
    LANA_ENUM stLanEnum;

    memset(&stNetCtrlBlock, 0, sizeof(stNetCtrlBlock));
    stNetCtrlBlock.ncb_command = NCBENUM;
    stNetCtrlBlock.ncb_buffer = (UCHAR *)&stLanEnum;
    stNetCtrlBlock.ncb_length = sizeof(stLanEnum);
    Netbios(&stNetCtrlBlock);
    ilRetVal = stLanEnum.length;
    for(int ilAdapter=0; ilAdapter < ilRetVal; ilAdapter++)
    {
    Application->ProcessMessages();
        memset(&stNetCtrlBlock, 0, sizeof(stNetCtrlBlock));
        stNetCtrlBlock.ncb_command = NCBRESET;
        stNetCtrlBlock.ncb_lana_num =   stLanEnum.lana[ilAdapter];
        Netbios(&stNetCtrlBlock);
        memset( &stNetCtrlBlock, 0, sizeof(stNetCtrlBlock) );
        stNetCtrlBlock.ncb_command = NCBASTAT;
        stNetCtrlBlock.ncb_lana_num =   stLanEnum.lana[ilAdapter];
        strcpy(stNetCtrlBlock.ncb_callname,"*               ");
        stNetCtrlBlock.ncb_length = sizeof(stAdapterStatus);
        pASTAT=HeapAlloc(GetProcessHeap(),HEAP_GENERATE_EXCEPTIONS|
        HEAP_ZERO_MEMORY, stNetCtrlBlock.ncb_length);
        if(pASTAT != NULL)
        {
            stNetCtrlBlock.ncb_buffer=(UCHAR *)pASTAT;
            Netbios(&stNetCtrlBlock);
            CopyMemory(&stAdapterStatus,stNetCtrlBlock.ncb_buffer,
            sizeof(stAdapterStatus));
            for(int i =0; i < 6; i++)
            {
                slMacAddress +=IntToHex(stAdapterStatus.adapt.adapter_address[i],2);
                if(i<5) slMacAddress+="-";
            }
            HeapFree(GetProcessHeap(),0,pASTAT);
         }
            else ilRetVal = 0;
    }
      return(slMacAddress);
}


y para usarla

Código:
this->Caption = GetMac()

_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

Hola Cesar, muchas gracias por tu respuesta, aunque no consigo que funcione integrado en mi programa. Me da un error en esta linea

Código:
 ADAPTER_STATUS  adapt;


Código:
[C++ Error] TFormConnectSocket.h(31): E2303 Type name expected.
[C++ Error] TFormConnectSocket.h(31): E2139 Declaration missing ;.


Puede ser porque la aplicacion no sea en consola? Lo digo porque el codigo que puse al principio del post, usa la misma estructura, y si lo compilo en un programa a parte para ejecutarlo en linea de comandos compila perfectamente, en cambio, cuando lo integro en mi aplicacion (grafica) no cosigo compilarlo. Tampoco me reconoce la estructura NCB

Será porque habrá alguna incompatibilidad?

Un saludo.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Un fallo por las prisas, se me olvida decirte que debes incluir el siguiente archivo de cabecera
Código:
#include <nb30.h>  // para la estructura ADAPTTER_STATUS

_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Gracias Responder citando

Muchas gracias, funciona a la perfeccion.

Si alguien lo intenta utilizar debe agregar la siguiente libreria

Código:
#include <mbstring.h>


y usar la funcion _mbscpy

Código:
//strcpy(stNetCtrlBlock.ncb_callname,"*               ");
        _mbscpy(stNetCtrlBlock.ncb_callname,"*               ");


Muchas gracias.


Por cierto Roid, has visto la aplicacion? Que te ha parecido?
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.