Hola foreros, estoy intentando obtener la gateway que me ofrece servicio a internet con la winapi, el problema es que tras discriminar todas las interfaces de red, me quedan 2 que son la de el wifi y la de ethernet, pero la de ethernet no tiene conexión, ¿qué hacer entonces para coger la correcta?, también puede darse el caso de que tenga ethernet y no wifi.
#include <pcap.h>
#include <winsock.h>
#define IPTOSBUFFERS 12
bool escaner();
bool seleccionar_interfaz(pcap_if_t *interfaz);
char* ip_string(u_long in);
bool escaner()
{
pcap_if_t * adaptadores_lista;
pcap_if_t * adaptador;
pcap_t * capturador = nullptr;
if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL, &adaptadores_lista, NULL) == -1)
return NULL;
if (adaptadores_lista == NULL)
return NULL;
for (adaptador = adaptadores_lista; adaptador != NULL; adaptador = adaptador->next)
{
if (seleccionar_interfaz(adaptador) == true)
break;
}
sniffer(adaptador->name,capturador);
pcap_freealldevs(adaptadores_lista);
}
bool seleccionar_interfaz(pcap_if_t *interfaz)
{
pcap_addr_t *a;
for (a = interfaz->addresses; a; a = a->next)
{//Está la wifi y ethernet. Coje la primera por defecto; Wi-Fi
if (a->addr->sa_family == AF_INET)
if (strcmp(ip_string(((struct sockaddr_in *)a->addr)->sin_addr.s_addr), "0.0.0.0") != 0)
return true;
}
return false;
}
char* ip_string(u_long in)
{
static char output[IPTOSBUFFERS][3 * 4 + 3 + 1];
static short which;
u_char *p;
p = (u_char *)∈
which = (which + 1 == IPTOSBUFFERS ? 0 : which + 1);
_snprintf_s(output[which], sizeof(output[which]), sizeof(output[which]), "%d.%d.%d.%d", p[0], p[1], p[2], p[3]);
return output[which];
}
Una solución sería abrirlas en orden y comprobar que existe tráfico en ellas y coger la que tenga tráfico. Pero tampoco me convence, ¿tenéis algo seguro para obtener la ip de la gateway en funcionamiento?
Saludos.