elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado:


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Función más eficiente para determinar si existe un dominio C++
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Función más eficiente para determinar si existe un dominio C++  (Leído 1,697 veces)
Kaxperday


Desconectado Desconectado

Mensajes: 702


The man in the Middle


Ver Perfil WWW
Función más eficiente para determinar si existe un dominio C++
« en: 14 Septiembre 2015, 21:24 pm »

Hola, pues eso, necesito pasar a una función un dominio en forma de cadena, y que me devuelva un "existe", "no sabemos si existe porque algo ha fallado como la red", "no existe".

La idea era hacerlo con gethostbyname():

Código
  1. WSAStartup(MAKEWORD(2, 0), &wsa);
  2. hostent *h = gethostbyname(dominio.c_str());
  3. if(h==NULL)WSAGetLastError();...

Y si existe la funcion devuelve distinto de NULL, pero si no puede conectar con el dominio devuelve NULL, entonces debo recojer el tipo de error producido con WSAGetLastError(), y aqui quiero diferenciar si es un error de red (que no haya internet por ejemplo) o que realmente la haya hecho y el server no responda, pero el problema es que WSAGetLastError() devuelve lo mismo si el host no existe que si tengo el wifi apagado.

Dicho esto, cree esta funcion:

Código
  1. estado_dominio existe_dominio(string dominio)
  2. {
  3. WSADATA wsaData;
  4. WSAStartup(MAKEWORD(2, 0), &wsaData);
  5. if (gethostbyname(dominio.c_str()) == NULL){
  6. if (gethostbyname("google.com") == NULL){
  7. WSACleanup();
  8. return SIN_CONEXION;
  9. }
  10. else{
  11. WSACleanup();
  12. return NO_EXISTE;
  13. }
  14. }
  15. WSACleanup();
  16. return SI_EXISTE;
  17. }

Pero no es eficiente ya que por cada peticion hace otra a google.com, de esta manera si google responde es que tenemos conexion.

¿Como lo puedo optimizar?.

De paso os dejo este code que fue el primero que hice pero no tenia sentido ya que  WSAGetLastError() devolvia siempre lo mismo.

Code:

Código
  1. int existe_dominio(string dominio)
  2. {
  3. WSADATA wsaData;
  4. WSAStartup(MAKEWORD(2, 0), &wsaData);
  5. if (gethostbyname(dominio.c_str()) == NULL){
  6. int error = WSAGetLastError();
  7. if (error == WSAHOST_NOT_FOUND){ //No existe host.
  8. WSACleanup();
  9. return 0;
  10. }
  11. else if (error == WSANO_DATA){ //Existe pero no envió datos.
  12. WSACleanup();
  13. return 1;
  14. }
  15. else if (error == WSANOTINITIALISED || //Reintentaremos puede existir host.
  16. error == WSAENETDOWN ||
  17. error == WSATRY_AGAIN ||
  18. error == WSANO_RECOVERY ||
  19. error == WSAEINPROGRESS ||
  20. error == WSAEFAULT ||
  21. error == WSAEINTR){
  22. WSACleanup();
  23. return 2;
  24. }
  25. else{ //No sabemos que ocurrió.
  26. WSACleanup();
  27. return 2;
  28. }
  29. }
  30. WSACleanup();
  31. return 1; //Encontrado y existe.
  32. }

¿Alguna funcion o metodo para comprobar si existe un dominio y que si falla diferencie entre fallo de red o falta de respuesta del servidor (no existe)?

Saludos, gracias.

Edito: Iba a probar con connect(), pero tenía que rellenar un struct in_addr y necesitaba la ip del server, para saberla primero tengo que resolverlo y si soy capaz de ello es que existe, luego no es metodo, ¿alguien sabe si se puede hacer con datagramas? ¿como sería? o un ping? ¿Cual sería el mejor método más rapido y eficiente?.

Saludos.


« Última modificación: 14 Septiembre 2015, 21:28 pm por Kaxperday » En línea

Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines