tags:

views:

583

answers:

2

Is there any way to determine if an XBAP (WPF hosted in a browser) application has network connectivity? If not, how would a traditional windows client written in C# and .NET determine if it has connectivity?

Basically the use case is an XBAP application running on a mobile laptop connected to an intranet via WiFi. The laptop will not have a connection to the Internet. The WiFi connection may or may not be there depending upon where the user is at the time.

+2  A: 

GateWayIPAddressInformation should work: http://msdn.microsoft.com/en-us/library/system.net.networkinformation.gatewayipaddressinformation(loband).aspx

If you get the gateway IP address, and you can Ping (http://msdn.microsoft.com/en-us/library/system.net.networkinformation.ping(loband).aspx) it you are probably connected.

Nate Bross
A: 

Do this in your InitializeComponent():

// Add EventHandler for NetworkAddressChanged event    
NetworkChange.NetworkAddressChanged += new NetworkAddressChangedEventHandler(AddressChangedCallback);

Here is the Method that is called when that event fires:

internal void AddressChangedCallback(object sender, EventArgs e)
{
    // Check for NetworkConnectivity
    _isInternetConnectionActive = new NetworkConnectivity().IsInternetConnected; 
}

Here is the NetworkConnectivity Class:

public class NetworkConnectivity
{
    private List<IPAddress> _ipAddresses = new List<IPAddress>();

    public NetworkConnectivity()
    {
        _ipAddresses = new List<IPAddress>();
    }

    #region Public Properties
    public int CountIPAddresses
    {
        get { return this.IPAddresses.Count; }
    }
    public List<IPAddress> IPAddresses
    {
        get
        {
            _ipAddresses.Clear();
            // Get a listing of all network adapters
            NetworkInterface[] adapters = NetworkInterface.GetAllNetworkInterfaces();
            foreach (NetworkInterface adapter in adapters)
            {
                IPInterfaceProperties adapterProperties = adapter.GetIPProperties();
                GatewayIPAddressInformationCollection addresses = adapterProperties.GatewayAddresses;
                // If this adapter has at least 1 IPAddress
                if (addresses.Count > 0)
                {
                    // Loop through all IP Addresses
                    foreach (GatewayIPAddressInformation address in addresses)
                    {
                        _ipAddresses.Add(address.Address);
                    }
                }
            } 
            return _ipAddresses;
        }
    }
    public bool IsInternetConnected
    {
        get
        {
            if (this.CountIPAddresses == 0)
            {
                return false;
            }
            else
            {
                //IPAddress[] ips = ResolveDNSAddress("google.com");
                //return PingIPAddressPool(ips);
                return PingIPAddress("72.14.204.104"); // Google IP
            }
        }
    }
    #endregion

    #region Public Methods
    public IPAddress[] ResolveDNSAddress(string UrlAddress)
    {
        IPHostEntry hostInfo = Dns.Resolve(UrlAddress);
        return hostInfo.AddressList;
    }
    public bool PingIPAddressPool(IPAddress[] ipAddresses)
    {
        foreach (IPAddress ip in ipAddresses)
        {
            if (PingIPAddress(ip.Address.ToString()))
            {
                return true;
            }
        }
        return false;
    }
    public bool PingIPAddress(string ip)
    {
        // Pinging
        IPAddress addr = IPAddress.Parse(ip);
        Ping pingSender = new Ping();
        PingOptions options = new PingOptions();

        // Use the default Ttl value which is 128,
        // but change the fragmentation behavior.
        options.DontFragment = true;

        // Create a buffer of 32 bytes of data to be transmitted.
        string data = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
        byte[] buffer = Encoding.ASCII.GetBytes(data);
        int timeout = 15; // seconds to wait for response
        int attempts = 2; // ping attempts
        for (int i = 0; i < attempts; i++)
        {
            PingReply reply = pingSender.Send(addr, timeout, buffer, options); 
            if (reply.Status == IPStatus.Success)
            { return true; }
        }
        return false;
    }
    #endregion

}
tubbytreats