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 :rolleyes: :rolleyes: :rolleyes:
Saludos.
Qué lio de punteros, señor.
PIP_ADAPTER_INFO* adaptador = nullptr;
¿Por qué un punteroa puntero? xD
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):
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.
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.
jajaja ostia.. :-[ :-[ :-[ :-X :-X
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? :xD :xD
Saludos.
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.
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:
lista_usuarios* buscar_usuarios()
{
lista_usuarios* lista_host = new lista_usuarios;
}
Lo compro, gracias ivancea <3.
Saludos.
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");
Ok, lo tendré en cuenta, muchas gracias ivancea, nos vemos.
Saludos.