La idea era hacerlo con gethostbyname():
Código
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
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
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.