Autor
|
Tema: Problema obtener datos de PIP_ADAPTER_INFO (Leído 2,903 veces)
|
Kaxperday
Desconectado
Mensajes: 702
The man in the Middle
|
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á: bool seleccionar_interfaz(PIP_ADAPTER_INFO* adaptador) { bool seleccion = false; PIP_ADAPTER_INFO pAdapterInfo; static PIP_ADAPTER_INFO pAdapter = NULL; DWORD dwRetVal = 0; ULONG ulOutBufLen = sizeof (IP_ADAPTER_INFO); pAdapterInfo = (IP_ADAPTER_INFO *)MALLOC(sizeof(IP_ADAPTER_INFO)); if (pAdapterInfo == NULL) return false; if (GetAdaptersInfo(pAdapterInfo, &ulOutBufLen) == ERROR_BUFFER_OVERFLOW) { FREE(pAdapterInfo); pAdapterInfo = (IP_ADAPTER_INFO *)MALLOC(ulOutBufLen); if (pAdapterInfo == NULL) return false; } if ((dwRetVal = GetAdaptersInfo(pAdapterInfo, &ulOutBufLen)) == NO_ERROR) { pAdapter = pAdapterInfo; while (pAdapter) { //Si tiene gateway y dirección IPv4 en la interfaz nos vale. if (pAdapter->DhcpEnabled == true && pAdapter->GatewayList.IpAddress.String && pAdapter->IpAddressList.IpAddress.String && strcmp(pAdapter->IpAddressList.IpAddress.String, "0.0.0.0") != 0 && strcmp(pAdapter->GatewayList.IpAddress.String, "0.0.0.0") != 0 ) { //printf("%s", pAdapter->GatewayList.IpAddress.String); Esta linea lo cambia todo, hace que funcione y no haya problema pero no quiero poner printf.. *adaptador = pAdapter; seleccion = true; break; } pAdapter = pAdapter->Next; } } else seleccion = false; if (pAdapterInfo) FREE(pAdapterInfo); return seleccion; }
La llamada y declaración de la función está aquí: lista_usuarios* buscar_usuarios() { PIP_ADAPTER_INFO* adaptador = nullptr; adaptador = (PIP_ADAPTER_INFO*)malloc(sizeof(PIP_ADAPTER_INFO)); if (seleccionar_interfaz(adaptador)) { printf("%s", (*adaptador)->GatewayList.IpAddress.String); } {
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 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
Mensajes: 3.412
ASMático
|
Qué lio de punteros, señor. PIP_ADAPTER_INFO* adaptador = nullptr;
¿Por qué un punteroa puntero? xD
|
|
|
En línea
|
|
|
|
Kaxperday
Desconectado
Mensajes: 702
The man in the Middle
|
jajaja ¿nullptr no es como NULL para punteros?, quiero decir puse NULL pero sin darme cuenta debió de escribir nullptr.. 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): lista_usuarios* buscar_usuarios() { static PIP_ADAPTER_INFO adaptador; //adaptador = (PIP_ADAPTER_INFO*)malloc(sizeof(PIP_ADAPTER_INFO)); if (seleccionar_interfaz(&adaptador)) { printf("%s", adaptador->GatewayList.IpAddress.String); }
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
Mensajes: 3.412
ASMático
|
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 if (pAdapterInfo) FREE(pAdapterInfo);
Estás liberando el contenido de la variable. PIP_ADAPTER_INFO es un puntero. Estás liberandolo.
|
|
|
En línea
|
|
|
|
Kaxperday
Desconectado
Mensajes: 702
The man in the Middle
|
jajaja ostia.. pAdapter = pAdapterInfo; if (pAdapterInfo) 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: lista_usuarios* buscar_usuarios() { static lista_usuarios lista_host; PIP_ADAPTER_INFO adaptador; 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? 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
Mensajes: 3.412
ASMático
|
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
Mensajes: 702
The man in the Middle
|
jajaja ok, pero como es eso de usar ¿new? ¿algún ejemplo? Si con eso quito el static por mi perfecto socio. MyClass * p1 = new MyClass; ¿con un puntero? Pues que gracia, si me pase a clases fue para acabar con los punteros de las estructuras entre otras cosas XD. Oye pues funciona: lista_usuarios* buscar_usuarios() { lista_usuarios* lista_host = new lista_usuarios; }
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
Mensajes: 3.412
ASMático
|
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: Clase obj = new Clase(1,2,"a");
|
|
|
En línea
|
|
|
|
Kaxperday
Desconectado
Mensajes: 702
The man in the Middle
|
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.
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Obtener Datos de una Imagen
Diseño Gráfico
|
pisagatos
|
4
|
4,060
|
24 Marzo 2006, 05:47 am
por aNexos
|
|
|
obtener datos de red
Programación Visual Basic
|
nahuelveronesi
|
2
|
2,948
|
13 Octubre 2009, 19:37 pm
por BlackZeroX
|
|
|
obtener datos de una web
Hacking
|
jadsera
|
4
|
4,110
|
14 Enero 2012, 18:21 pm
por H1tchclock
|
|
|
Obtener datos de la sbs
« 1 2 »
Programación Visual Basic
|
dany22_
|
10
|
4,082
|
3 Julio 2015, 17:18 pm
por dany22_
|
|
|
Problema con obtener datos de db en node
Desarrollo Web
|
antkk
|
1
|
1,746
|
27 Marzo 2018, 23:40 pm
por srWhiteSkull
|
|