| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
titomac Cdt

Registrado: 23 Feb 2006Mensajes: 18
|
Publicado: Dom 28 May, 2006 10:06 pm Asunto: Enviar direccion MAC a un servidor |
|
|
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 |
|
 |
Roid Cmdr

Registrado: 18 Ene 2004Mensajes: 135
|
|
| Volver arriba |
|
 |
titomac Cdt

Registrado: 23 Feb 2006Mensajes: 18
|
Publicado: Lun 29 May, 2006 3:10 pm Asunto: |
|
|
Muchas gracias por tu respuesta.
Primera parte superada  |
|
| Volver arriba |
|
 |
Roid Cmdr

Registrado: 18 Ene 2004Mensajes: 135
|
Publicado: Lun 29 May, 2006 10:39 pm Asunto: |
|
|
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 |
|
 |
titomac Cdt

Registrado: 23 Feb 2006Mensajes: 18
|
Publicado: Mar 30 May, 2006 10:34 am Asunto: |
|
|
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 |
|
 |
Roid Cmdr

Registrado: 18 Ene 2004Mensajes: 135
|
Publicado: Mar 30 May, 2006 9:06 pm Asunto: |
|
|
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 |
|
 |
Roid Cmdr

Registrado: 18 Ene 2004Mensajes: 135
|
Publicado: Mar 30 May, 2006 9:39 pm Asunto: |
|
|
Pasate tb la direccion para q le eche un vistazo.
Un saludo...... |
|
| Volver arriba |
|
 |
titomac Cdt

Registrado: 23 Feb 2006Mensajes: 18
|
|
| Volver arriba |
|
 |
titomac Cdt

Registrado: 23 Feb 2006Mensajes: 18
|
Publicado: Lun 05 Jun, 2006 10:12 pm Asunto: |
|
|
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 |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Mar 06 Jun, 2006 2:59 am Asunto: |
|
|
| 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() |
_________________
 |
|
| Volver arriba |
|
 |
titomac Cdt

Registrado: 23 Feb 2006Mensajes: 18
|
Publicado: Vie 09 Jun, 2006 8:42 am Asunto: |
|
|
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 |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Vie 09 Jun, 2006 10:13 am Asunto: |
|
|
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 |
_________________
 |
|
| Volver arriba |
|
 |
titomac Cdt

Registrado: 23 Feb 2006Mensajes: 18
|
Publicado: Sab 10 Jun, 2006 4:30 pm Asunto: Gracias |
|
|
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 |
|
 |
|