Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Kaxperday en 18 Junio 2015, 10:12 am



Título: Ayuda obtener gateway con winapi
Publicado por: Kaxperday en 18 Junio 2015, 10:12 am
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.

Código
  1. #include <pcap.h>
  2. #include <winsock.h>
  3. #define IPTOSBUFFERS 12
  4. bool escaner();
  5. bool seleccionar_interfaz(pcap_if_t *interfaz);
  6. char* ip_string(u_long in);
  7. bool escaner()
  8. {
  9. pcap_if_t * adaptadores_lista;
  10. pcap_if_t * adaptador;
  11. pcap_t * capturador = nullptr;
  12.  
  13. if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL, &adaptadores_lista, NULL) == -1)
  14. return NULL;
  15.  
  16. if (adaptadores_lista == NULL)
  17. return NULL;
  18.  
  19. for (adaptador = adaptadores_lista; adaptador != NULL; adaptador = adaptador->next)
  20. {
  21. if (seleccionar_interfaz(adaptador) == true)
  22. break;
  23. }
  24.  
  25. sniffer(adaptador->name,capturador);
  26. pcap_freealldevs(adaptadores_lista);
  27. }
  28.  
  29. bool seleccionar_interfaz(pcap_if_t *interfaz)
  30. {
  31. pcap_addr_t *a;
  32.  
  33. for (a = interfaz->addresses; a; a = a->next)
  34. {//Está la wifi y ethernet. Coje la primera por defecto; Wi-Fi
  35. if (a->addr->sa_family == AF_INET)
  36. if (strcmp(ip_string(((struct sockaddr_in *)a->addr)->sin_addr.s_addr), "0.0.0.0") != 0)
  37. return true;
  38. }
  39. return false;
  40. }
  41.  
  42. char* ip_string(u_long in)
  43. {
  44. static char output[IPTOSBUFFERS][3 * 4 + 3 + 1];
  45. static short which;
  46. u_char *p;
  47.  
  48. p = (u_char *)&in;
  49. which = (which + 1 == IPTOSBUFFERS ? 0 : which + 1);
  50. _snprintf_s(output[which], sizeof(output[which]), sizeof(output[which]), "%d.%d.%d.%d", p[0], p[1], p[2], p[3]);
  51. return output[which];
  52. }

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.