elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Problema obtener datos de PIP_ADAPTER_INFO
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Problema obtener datos de PIP_ADAPTER_INFO  (Leído 2,575 veces)
Kaxperday


Desconectado Desconectado

Mensajes: 702


The man in the Middle


Ver Perfil WWW
Problema obtener datos de PIP_ADAPTER_INFO
« en: 8 Julio 2015, 22:08 pm »

Lo de siempre diría, llamo a una función a la que le paso un PIP_ADAPTER_INFO por referencia, y me la rellenará:

Código
  1. bool seleccionar_interfaz(PIP_ADAPTER_INFO* adaptador)
  2. {
  3. bool seleccion = false;
  4. PIP_ADAPTER_INFO pAdapterInfo;
  5. static PIP_ADAPTER_INFO pAdapter = NULL;
  6. DWORD dwRetVal = 0;
  7.  
  8. ULONG ulOutBufLen = sizeof (IP_ADAPTER_INFO);
  9. pAdapterInfo = (IP_ADAPTER_INFO *)MALLOC(sizeof(IP_ADAPTER_INFO));
  10.  
  11. if (pAdapterInfo == NULL)
  12. return false;
  13.  
  14. if (GetAdaptersInfo(pAdapterInfo, &ulOutBufLen) == ERROR_BUFFER_OVERFLOW)
  15. {
  16. FREE(pAdapterInfo);
  17. pAdapterInfo = (IP_ADAPTER_INFO *)MALLOC(ulOutBufLen);
  18. if (pAdapterInfo == NULL)
  19. return false;
  20. }
  21.  
  22. if ((dwRetVal = GetAdaptersInfo(pAdapterInfo, &ulOutBufLen)) == NO_ERROR)
  23. {
  24. pAdapter = pAdapterInfo;
  25. while (pAdapter)
  26. {
  27. //Si tiene gateway y dirección IPv4 en la interfaz nos vale.
  28. if (pAdapter->DhcpEnabled == true &&
  29. pAdapter->GatewayList.IpAddress.String &&
  30. pAdapter->IpAddressList.IpAddress.String &&
  31. strcmp(pAdapter->IpAddressList.IpAddress.String, "0.0.0.0") != 0 &&
  32. strcmp(pAdapter->GatewayList.IpAddress.String, "0.0.0.0") != 0 )
  33. {
  34. //printf("%s", pAdapter->GatewayList.IpAddress.String); Esta linea lo cambia todo, hace que funcione y no haya problema pero no quiero poner printf..
  35. *adaptador = pAdapter;
  36. seleccion = true;
  37. break;
  38. }
  39. pAdapter = pAdapter->Next;
  40. }
  41. }
  42. else
  43. seleccion = false;
  44. if (pAdapterInfo)
  45. FREE(pAdapterInfo);
  46. return seleccion;
  47. }
  48.  

La llamada y declaración de la función está aquí:

Código
  1. lista_usuarios* buscar_usuarios()
  2. {
  3. PIP_ADAPTER_INFO* adaptador = nullptr;
  4.  
  5. adaptador = (PIP_ADAPTER_INFO*)malloc(sizeof(PIP_ADAPTER_INFO));
  6.  
  7. if (seleccionar_interfaz(adaptador))
  8.        {
  9.  
  10.        printf("%s", (*adaptador)->GatewayList.IpAddress.String);
  11. }
  12. {

Este printf muestra basura, ¿porqué?. Cuando pongo el printf que muestro de comentario en seleccionar_inferfaz() no muestra basura, funciona.

Lo paso como referencia esta vez, y he reservado memoria previamente. No se que puede ser XD.

Siento que abuso del foro  :rolleyes: :rolleyes: :rolleyes:

Saludos.


« Última modificación: 8 Julio 2015, 22:15 pm por Kaxperday » En línea

Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.
ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Problema obtener datos de PIP_ADAPTER_INFO
« Respuesta #1 en: 8 Julio 2015, 22:55 pm »

Qué lio de punteros, señor.

Código
  1. PIP_ADAPTER_INFO* adaptador = nullptr;

¿Por qué un punteroa puntero? xD


En línea

Kaxperday


Desconectado Desconectado

Mensajes: 702


The man in the Middle


Ver Perfil WWW
Re: Problema obtener datos de PIP_ADAPTER_INFO
« Respuesta #2 en: 8 Julio 2015, 22:58 pm »

jajaja ¿nullptr no es como NULL para punteros?, quiero decir puse NULL pero sin darme cuenta debió de escribir nullptr..  :silbar: :silbar: XD

¿Pero no da igual eso que inicializarles a NULL? ¿Es indiferente o no? XD

Saludos.

Edito: Por cierto he modificado el código ahora tengo esto (elimine el puntero no hacia falta):

Código
  1. lista_usuarios* buscar_usuarios()
  2. {
  3. static PIP_ADAPTER_INFO adaptador;
  4.  
  5. //adaptador = (PIP_ADAPTER_INFO*)malloc(sizeof(PIP_ADAPTER_INFO));
  6.  
  7. if (seleccionar_interfaz(&adaptador))
  8. {
  9. printf("%s", adaptador->GatewayList.IpAddress.String);
  10. }
  11.  

Pues no era necesario realmente el puntero, pero aún así no funciona XP.
« Última modificación: 8 Julio 2015, 23:04 pm por Kaxperday » En línea

Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.
ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Problema obtener datos de PIP_ADAPTER_INFO
« Respuesta #3 en: 8 Julio 2015, 23:10 pm »

Por curiosidad, por qué todas las variables las pones static .__.
Si bien es una forma de actuar, para evitar copiar variables a cambio de una limitada disponibilidad de ella, también es un modo más peligroso al trabajar con punteros.

Además
Código
  1. if (pAdapterInfo)
  2. FREE(pAdapterInfo);

Estás liberando el contenido de la variable. PIP_ADAPTER_INFO es un puntero. Estás liberandolo.
En línea

Kaxperday


Desconectado Desconectado

Mensajes: 702


The man in the Middle


Ver Perfil WWW
Re: Problema obtener datos de PIP_ADAPTER_INFO
« Respuesta #4 en: 8 Julio 2015, 23:19 pm »

jajaja ostia..  :-[ :-[ :-[  :-X :-X

Código
  1. pAdapter = pAdapterInfo;
  2. if (pAdapterInfo)
  3. FREE(pAdapterInfo);

Lo vaciaba y no me daba cuenta tanto código, me paso completamente desapercibido, pero es curioso, pero sin embargo me funcionaba pasar las ips a u_char* y me hacia arp a el rango de ips, a pesar de que tenía basura y de que la había vaciado, pero claro no sabía porque era entonces.

En este caso la puse static por probar, pues para la variable lista_usuarios, gracias a que la declaré estática, luego puedo acceder a ella desde el main, devolviendo su valor con &lista_usuarios. Si no la pongo static pierde su valor y memoria al salir de la funcion, tendría que pasar un puntero como argumento a la función para obtener la lista:

Código
  1. lista_usuarios* buscar_usuarios()
  2. {
  3. static lista_usuarios lista_host;
  4. PIP_ADAPTER_INFO adaptador;
  5. return &lista_host;

Si no es static, se pierde su valor al recoger la lista en el main.

Por cierto que tiene de malo inicializar un puntero con un nullptr?  :xD :xD

Saludos.
« Última modificación: 8 Julio 2015, 23:25 pm por Kaxperday » En línea

Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.
ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Problema obtener datos de PIP_ADAPTER_INFO
« Respuesta #5 en: 8 Julio 2015, 23:40 pm »

No dije que nullptr sea malo. Dije que estabas poniendo un IP** sin razón aparente xD

La forma de evitar static, es, o copiando la estructura, o pasándo un puntero sacado con new. E insisto, deberías usar new en C++, especialmente si trabajas con clases o estructuras.
En línea

Kaxperday


Desconectado Desconectado

Mensajes: 702


The man in the Middle


Ver Perfil WWW
Re: Problema obtener datos de PIP_ADAPTER_INFO
« Respuesta #6 en: 8 Julio 2015, 23:44 pm »

jajaja ok, pero como es eso de usar ¿new? ¿algún ejemplo? Si con eso quito el static por mi perfecto socio.

Código:
 MyClass * p1 = new MyClass;

¿con un puntero?  :laugh: :laugh:

Pues que gracia, si me pase a clases fue para acabar con los punteros de las estructuras entre otras cosas XD.

Oye pues funciona:

Código
  1. lista_usuarios* buscar_usuarios()
  2. {
  3. lista_usuarios* lista_host = new lista_usuarios;
  4. }

Lo compro, gracias ivancea <3.

Saludos.
« Última modificación: 8 Julio 2015, 23:47 pm por Kaxperday » En línea

Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.
ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Problema obtener datos de PIP_ADAPTER_INFO
« Respuesta #7 en: 9 Julio 2015, 00:30 am »

Los punteros no son algo malo :/
Son algo necesario y muy útil, que seguirás usando.

Con new además, llamas al constructor de la clase o estructura:

Código
  1. Clase obj = new Clase(1,2,"a");
En línea

Kaxperday


Desconectado Desconectado

Mensajes: 702


The man in the Middle


Ver Perfil WWW
Re: Problema obtener datos de PIP_ADAPTER_INFO
« Respuesta #8 en: 9 Julio 2015, 10:53 am »

Ok, lo tendré en cuenta, muchas gracias ivancea, nos vemos.

Saludos.
En línea

Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Obtener Datos de una Imagen
Diseño Gráfico
pisagatos 4 3,856 Último mensaje 24 Marzo 2006, 05:47 am
por aNexos
obtener datos de red
Programación Visual Basic
nahuelveronesi 2 2,812 Último mensaje 13 Octubre 2009, 19:37 pm
por BlackZeroX
obtener datos de una web
Hacking
jadsera 4 3,892 Último mensaje 14 Enero 2012, 18:21 pm
por H1tchclock
Obtener datos de la sbs « 1 2 »
Programación Visual Basic
dany22_ 10 3,706 Último mensaje 3 Julio 2015, 17:18 pm
por dany22_
Problema con obtener datos de db en node
Desarrollo Web
antkk 1 1,566 Último mensaje 27 Marzo 2018, 23:40 pm
por srWhiteSkull
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines