priya_d
priya_d

Reputation: 403

How to get speed of network, whether it is fast or slow in xamarin iOS?

How to get speed of network, whether it is fast or slow in xamarin iOS? I used NetworkReachability, But it is giving result that url is reachable or not? I want to get speed of network , fast or poor?` private static NetworkReachability _defaultRouteReachability;

    public static event EventHandler ReachabilityChanged;

    public static bool IsNetworkAvailable(string url)
    {
        if (_defaultRouteReachability == null)
        {
            _defaultRouteReachability = new NetworkReachability(url);
            _defaultRouteReachability.SetNotification(OnChange);
            _defaultRouteReachability.Schedule(CFRunLoop.Current, CFRunLoop.ModeDefault);
        }

        NetworkReachabilityFlags flags;

        return _defaultRouteReachability.TryGetFlags(out flags) &&
            IsReachableWithoutRequiringConnection(flags);
    }

    private static bool IsReachableWithoutRequiringConnection(NetworkReachabilityFlags flags)
    {
        // Is it reachable with the current network configuration?
        bool isReachable = (flags & NetworkReachabilityFlags.Reachable) != 0;

        // Do we need a connection to reach it?
        bool noConnectionRequired = (flags & NetworkReachabilityFlags.ConnectionRequired) == 0;

        // Since the network stack will automatically try to get the WAN up,
        // probe that
        if ((flags & NetworkReachabilityFlags.IsWWAN) != 0)
            noConnectionRequired = true;

        return isReachable && noConnectionRequired;
    }

    private static void OnChange(NetworkReachabilityFlags flags)
    {
        var h = ReachabilityChanged;
        if (h != null)
            h(null, EventArgs.Empty);
    }`

Upvotes: 1

Views: 1508

Answers (1)

Saamer
Saamer

Reputation: 5099

Something like this can help you, unless you want to use a library. This basically gives you the technical definition of internet speed, but the real number will be a little bigger. It's very similar to the solution suggested by @Martheen

public async Task<string> CheckInternetSpeed()
{
    //DateTime Variable To Store Download Start Time.
    DateTime dt1 = DateTime.Now;
    string internetSpeed;
    try
    {
        // Create Object Of WebClient
        var client = new HttpClient();
        //Number Of Bytes Downloaded Are Stored In ‘data’
        byte[] data = await client.GetByteArrayAsync("https://www.example.com/");
        //DateTime Variable To Store Download End Time.
        DateTime dt2 = DateTime.Now;
        //To Calculate Speed in Kb Divide Value Of data by 1024 And Then by End Time Subtract Start Time To Know Download Per Second.
        Console.WriteLine("ConnectionSpeed: DataSize (kb) " + data.Length / 1024);
        Console.WriteLine("ConnectionSpeed: ElapsedTime (secs) " + (dt2 - dt1).TotalSeconds);
        internetSpeed = "ConnectionSpeed: (kb/s) " + Math.Round((data.Length / 1024) / (dt2 - dt1).TotalSeconds, 2);
    }
    catch (Exception ex)
    {
        internetSpeed = "ConnectionSpeed:Unknown Exception-" + ex.Message;
    }
    Console.WriteLine(internetSpeed);
    return internetSpeed;
}

Xamarin Essentials library can't get you Internet speed, but if you use dependency injection, you can use the native api s like this.

Upvotes: 2

Related Questions