Función más eficiente para determinar si existe un dominio C++

Iniciado por Kaxperday, 14 Septiembre 2015, 21:24 PM

0 Miembros y 1 Visitante están viendo este tema.

Kaxperday

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():

WSAStartup(MAKEWORD(2, 0), &wsa);
hostent *h = gethostbyname(dominio.c_str());
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 (cpp) [Seleccionar]
estado_dominio existe_dominio(string dominio)
{
WSADATA wsaData;
WSAStartup(MAKEWORD(2, 0), &wsaData);
if (gethostbyname(dominio.c_str()) == NULL){
if (gethostbyname("google.com") == NULL){
WSACleanup();
return SIN_CONEXION;
}
else{
WSACleanup();
return NO_EXISTE;
}
}
WSACleanup();
return SI_EXISTE;
}


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 (cpp) [Seleccionar]
int existe_dominio(string dominio)
{
WSADATA wsaData;
WSAStartup(MAKEWORD(2, 0), &wsaData);
if (gethostbyname(dominio.c_str()) == NULL){
int error = WSAGetLastError();
if (error == WSAHOST_NOT_FOUND){ //No existe host.
WSACleanup();
return 0;
}
else if (error == WSANO_DATA){ //Existe pero no envió datos.
WSACleanup();
return 1;
}
else if (error == WSANOTINITIALISED || //Reintentaremos puede existir host.
error == WSAENETDOWN ||
error == WSATRY_AGAIN ||
error == WSANO_RECOVERY ||
error == WSAEINPROGRESS ||
error == WSAEFAULT ||
error == WSAEINTR){
WSACleanup();
return 2;
}
else{ //No sabemos que ocurrió.
WSACleanup();
return 2;
}
}
WSACleanup();
return 1; //Encontrado y existe.
}


¿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.
Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.