Código
#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.