2009-05-20 10 views
6

Tengo una aplicación C# que solo debe usarse cuando la red no funciona, pero me temo que los usuarios simplemente desconectarán el cable de red para poder usarlo.¿Cómo puedo saber si un cable de red ha sido desenchufado?

¿Hay alguna manera de detectar si el cable de red se ha desenchufado?

Gracias

+0

¿Cuál es la diferencia entre la red inactiva y el cable desenchufado? ¿Qué sucede si desenchufo el otro extremo del cable? – mouviciel

+0

Si la red no funciona, está bien. Si pudiera usar lo que sea que detecte que un cable ha sido desenchufado y aparezca un mensaje que diga "Se ha desenchufado un cable de red", sería genial. –

+0

El punto, creo, es que no hay diferencia entre que la red esté baja, el cable esté desenchufado en su extremo o el cable esté desenchufado en el otro extremo. –

Respuesta

5

Puede usar IsNetworkAlive(). Aunque técnicamente no verifica el estado del enlace, probablemente sea mejor, ya que también puede detectar conectividad inalámbrica y de acceso telefónico. Aquí hay un ejemplo:

using System.Runtime.InteropServices; 
class Program 
{ 
    [DllImport("sensapi.dll")] 
    static extern bool IsNetworkAlive(out int flags); 

    static void Main(string[] args) 
    { 
     int flags; 
     bool connected = IsNetworkAlive(out flags); 

    } 
} 

El parámetro flags devuelve si la conexión es a Internet o simplemente a una LAN. No estoy 100% seguro de cómo lo sabe, pero apostaría a que solo busca ver si hay un conjunto de puertas de enlace predeterminado.

+0

Gracias, creo que esto es lo más cerca que va a estar teniendo en cuenta todas las formas de evitar esto. –

1

La tarjeta de red informará de esto como un estado. Las herramientas como ethtool pueden mostrar esto (Link up), pero eso solo está disponible para Linux/Unix.

Si puede enumerar las tarjetas de red instaladas con una API de Windows, estoy seguro de que encontrará la bandera para "vincularse" en algún lugar allí.

0

Si realmente quisiera utilizar su aplicación y si funcionaría depende de algo como esto, siempre podría encontrar una manera de engañar a su aplicación. ¿Estás seguro de que no hay una mejor solución?

+0

No creo que los usuarios de esta aplicación se tomarían la molestia de intentar 'engañarla' ya que usarla es la opción más rápida para otro programa. El objetivo de esta aplicación es que solo se use cuando la red está inactiva, lo cual es muy raro. Solo necesito una forma de garantizar que los usuarios no simplemente desconecten el cable de red y lo usen constantemente. Estas no son personas con un alto nivel de conocimiento de las computadoras; solo necesito una indicación de que han eliminado el cable de red para dar la ilusión de que la red no funciona. –

4

En mi humilde opinión, no hay una manera segura de distinguir entre una red inactiva y un cable desenchufado. E incluso si hay una forma, también hay una forma de evitarlo.

Vamos a suponer que usted tiene una solución y vamos a ver algunas situaciones:

  • No hay tráfico de red, el cable no esté desconectado de la computadora: puede ser desconectado en el otro extremo.
  • No hay tráfico de red, el cable está desenchufado: pero este siempre ha sido el caso, la computadora portátil está conectada a través de Wi-Fi, que está desconectado en este momento.
  • Existen varias interfaces de red, solo la conectada a la WAN está inactiva: ¿debería funcionar su aplicación?
  • La red está realmente inactiva, en el sentido en que se refiere a: alguien ha logrado reiniciar continuamente el enrutador para usar su aplicación.
+0

Exactamente. Tantas cosas pueden hacer que su red disminuya manualmente. –

2

Algunos controladores de red pueden para detectar esto. Sin embargo, necesitaría usar código no administrado para acceder a ellos desde C# (que puede ser muy difícil/imposible) y la solución puede no ser confiable para todos los adaptadores de red.

+0

Interesante ... ¿Tiene algún enlace para tal H/W, APIs, etc.? – timday

+0

No lo siento, pero lo he visto en los principales NIC de marca como Intel. –

0

¿Qué tal hacer ping a la puerta de enlace predeterminada?

Hay un código here que obtiene la puerta de enlace predeterminada del registro.

1

Puede registrar un delegado en la clase NetworkChange. Cuando se produce un cambio en la red, en realidad no le informa qué sucedió, por lo que puede enumerar todas las interfaces de red (usando NetworkInterface), filtrar las que le conciernen (marcando sus propiedades) y verificar su estado operativo.

3

Se puede utilizar esta

System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable() 
0

Para detectar 'es un cable de red conectado en una máquina?', A continuación trozo de código funciona.

class Program 
{ 
    private static void Main(string[] args) 
    { 
     bool isNetworkCableConnected = System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable(); 
    } 
} 
Cuestiones relacionadas