Problema obtener datos de PIP_ADAPTER_INFO

Iniciado por Kaxperday, 8 Julio 2015, 22:08 PM

0 Miembros y 1 Visitante están viendo este tema.

Kaxperday

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 (cpp) [Seleccionar]
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í:

Código (cpp) [Seleccionar]
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  :rolleyes: :rolleyes: :rolleyes:

Saludos.
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

Qué lio de punteros, señor.

Código (cpp) [Seleccionar]
PIP_ADAPTER_INFO* adaptador = nullptr;

¿Por qué un punteroa puntero? xD

Kaxperday

#2
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 (cpp) [Seleccionar]
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.
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

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 (cpp) [Seleccionar]
if (pAdapterInfo)
FREE(pAdapterInfo);


Estás liberando el contenido de la variable. PIP_ADAPTER_INFO es un puntero. Estás liberandolo.

Kaxperday

#4
jajaja ostia..  :-[ :-[ :-[  :-X :-X

Código (cpp) [Seleccionar]
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:

Código (cpp) [Seleccionar]
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?  :xD :xD

Saludos.
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

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.

Kaxperday

#6
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?  :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 (cpp) [Seleccionar]
lista_usuarios* buscar_usuarios()
{
lista_usuarios* lista_host = new lista_usuarios;
}


Lo compro, gracias ivancea <3.

Saludos.
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

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 (cpp) [Seleccionar]
Clase obj = new Clase(1,2,"a");

Kaxperday

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

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