Como puedo comprobar si ay una conexión a Una determinada pagina web.

Iniciado por andrecid, 13 Julio 2015, 12:38 PM

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

andrecid

Hola me gustaría saber como se podría hacer para saber si se tiene conexión a una determinada pagina web es decir:

Si mi navegador está conectado a WWW.GOOGLE.ES (Por ejemplo)

No quiero que sea por medio de ping.

Lo que quiero es si el navegador tiene esa conexión aparezca un mensaje.Si el navegador no esta conectado a esa página web, entonces aparece otro mensaje.

Es que estoy estudiando C# y me ha entrado esa duda. ( Soy autodidacta )

Eleкtro

#1
Buenas

Se me ocurren dos maneras muy distintas, dependiendo de las circunstancias te recomendaría una o la otra.

La primera sería haciendo uso de los miembros expuestos en el namespace System.Net.NetworkInformation, IPGlobalProperties, IPEndPoint y por último TcpConnectionInformation para obtener las conexiones TCP establecidas por "X" proceso, y luego, si la situación lo requiere para tus necesidades, deberás resolver la dirección utilizando un servicio whois/lookup online o por ejemplo con la función System.Net.Dns.GetHostEntry la cual devuelve un objeto del tipo System.Net.IpHostEntry y entonces podrás comparar el valor de la propiedad System.Net.IpHostEntry.Hostname.

La segunda manera sería analizar la aplicación del navegador en cuestión (un app-spy) para obtener los nombes y los handles de las ventanas y los controles que examinar etc etc y entonces recurrir al P/Invoking en particular funciones cómo FindWindowEx y EnumChildwindows (entre otras funciones más) para así obtener las direcciones url de las barras de dirección de las pestañas abiertas del navegador en cuestión y poder vevrificar si existe "X" url abierta en alguna pestaña;
puedes llevar a cabo la misma tarea con el framework de accesibilidad denominado Microsoft UI Automation contenido en el namespace System.Windows.Automation, lo que resultaría un procedimiento mucho más sofisticada y eficiente que recurrir a llamadas de la API de Windows.

Si desconoces la IP en cuestión y si conoces el/los nombre del proceso que quieres examinar entonces yo optaría por la seguna opción, UI automation, ya que en términos de tiempo de ejecución sería un procedimiento mucho más corto al no tener que resolver ninguna IP, pero primero tienes que analizar bien la app del navegador para obtener los datos necesarios, esa es la parte tediosa; puedes agilizar la tarea de inspección con utilidades del tipo UI Inspect (entre otras) contenidad en las herramientas de la SDK de Windows, o herramientas de terceros cómo XAML Spy (no te dejes engañar por lo de XAML) o WinSpy++, siendo esta última algo obsoleta ya.

Saludos








andrecid

Muchas gracias!

Ahora empezare a estudiar que es eso que dijiste.


sqln00b

@Elektro tiene razón, es la mejor forma, pero... siempre hay formas y formas, a mi me gusta lo rápido. (Quizás no lo más limpio y lo mejor...) :rolleyes:

Te tiro una idea, utiliza el netstat y ejecutalo desde un proceso.

Código (C#) [Seleccionar]

public static void Main(string[] args)
{
Console.WriteLine("Test de Conexion.");

// ######### VARS #########
// EN MI CASO USO FIREFOX.
string navegador = "[firefox.exe]";
// MISTERIOSO DOMINIO DE GOOGLE... LULZ, USO HTTP PERO DEBERÍA USARSE HTTPS.
string servicio_web = ".1e100.net:http";
// ######### VARS #########

// CREO EL PROCESO Y LE PASO LOS ARGUMENTOS.
System.Diagnostics.Process procesoCMD = new System.Diagnostics.Process();
procesoCMD.StartInfo.FileName = "netstat.exe";
procesoCMD.StartInfo.Arguments = "-b";
procesoCMD.StartInfo.UseShellExecute = false;
procesoCMD.StartInfo.RedirectStandardOutput = true;
procesoCMD.StartInfo.RedirectStandardError = true;
procesoCMD.StartInfo.RedirectStandardInput = true;

// OBTENGO LA RESPUESTA DEL NETSTAT.
procesoCMD.Start();
procesoCMD.BeginErrorReadLine();
string respuesta = procesoCMD.StandardOutput.ReadToEnd();
procesoCMD.WaitForExit();

// COMPRUEBO SI ESTÁ EL NAVEGADOR.
if(respuesta.Contains(navegador))
{
Console.WriteLine("Hay una conexión de navegador.");

// CONFUSO, PERO SACO LÍNEAS PARA COMPROBAR SI CORRESPONDE A GOOGLE.
string[] lineas = System.Text.RegularExpressions.Regex.Split(respuesta, Environment.NewLine);

// SALTO SI YA SÉ QUE ESTÁ EN GOOGLE.
bool servicio_web_existe = false;

for (int linea = 0; linea < lineas.Length; linea++) {

// ##### POSIBLE BUG, SE COMPRUEBA SI EXISTE CONEXIÓN #####
// ##### HACIA EL DOMINIO DE GOOGLE PERO NO           #####
// ##### SI EL PROCESO CORRESPONDE AL NAVEGADOR.      #####

if(lineas[linea].Contains(servicio_web))
{
Console.WriteLine("¡Y está conectada a google!");
servicio_web_existe = true;
break;
}

}
// COMPRUEBO SI HUBO CONEXIÓN, EN TODO CASO REPORTO NEGATIVO
if(!servicio_web_existe)
{
Console.WriteLine("¡Pero no está conectado a google!");
}
}
else
{
Console.WriteLine("No hay conexión de navegador.");
}

// HAY QUE CUIDAR EL HEAP, MÁS CUANDO UNO NO TIENE UN SUPER PC...
procesoCMD.Dispose();

Console.ReadKey();
}


Hay que tener en cuenta que sólo ve mientras esté navegando, es decir si se cierra la conexion o hay un time-out se borra. No es lo mejor, pero es lo práctico para salir del apuro. :xD

¡¡Suerte!!