Bug 29746 - NetworkReachability TryGetFlags hangs when packet loss is 100 percent
Summary: NetworkReachability TryGetFlags hangs when packet loss is 100 percent
Status: RESOLVED ANSWERED
Alias: None
Product: iOS
Classification: Xamarin
Component: Xamarin.iOS.dll (show other bugs)
Version: XI 10.12 (d15-3)
Hardware: PC Mac OS
: Normal normal
Target Milestone: Future Cycle (TBD)
Assignee: Bugzilla
URL:
Depends on:
Blocks:
 
Reported: 2015-05-05 09:50 UTC by John Miller [MSFT]
Modified: 2017-10-24 14:49 UTC (History)
10 users (show)

See Also:
Tags: ac
Is this bug a regression?: No
Last known good build:


Attachments
Test Case (18.65 KB, application/zip)
2015-05-05 09:50 UTC, John Miller [MSFT]
Details

Description John Miller [MSFT] 2015-05-05 09:50:39 UTC
Created attachment 11068 [details]
Test Case

**Overview:**

   NetworkReachability.TryGetFlags hangs when the network packet loss is 100%. 

**Steps to Reproduce:**

    1. Use the Network Link Conditioner to cause 100% packet loss (if you need that, http://nshipster.com/network-link-conditioner/)
    2. Run the attached sample on an iOS Simulator

**Actual Results:**

   It will hang when launching because of the IsHostReachable call of the Reachability.cs class

**Expected Results:**

   No hang, and it should return false. 

**Build Date & Platform:**

   XI 8.10
   Mono 4.0
   Xcode 6.3
   iOS 8.3

**Additional Information:**

   The code being used for the Reachability sample is

public static bool IsHostReachable(string host)
    {
        if (string.IsNullOrEmpty(host))
            return false;

        using (var r = new NetworkReachability(host))
        {
            NetworkReachabilityFlags flags;

            if (r.TryGetFlags(out flags)) // Hangs here
            {
                return IsReachableWithoutRequiringConnection(flags);
            }
        }
        return false;
    }
Comment 1 Sebastien Pouliot 2015-05-07 16:55:20 UTC
The call to `SCNetworkReachabilityGetFlags` takes a few seconds but it does get back and shows

2015-05-07 16:52:00.281 ReachabilityTest[90947:19574570] false
Comment 2 Sebastien Pouliot 2015-05-07 17:01:55 UTC
hmm... maybe it took more time than the simulator watchdog allowed ?

@John could you reproduce it ? is so where the call stack if you hit pause ? or does it eventually quit (watchdog) ?

Having undefined time functions calls in FinishedLaunching is a common issue [1] that can bite you back - generally seen on device (but there's now a watchdog on the simulator too).

[1] https://developer.apple.com/library/ios/qa/qa1693/_index.html
Comment 3 Marcin Kuptel 2015-07-06 10:40:39 UTC
I'm experiencing a similar issue. My app starts several image downloads. Before they are all finished, I use Network Link Conditioner to manipulate my connection so that all packets are lost. The requests that are still in progress never return.
Comment 4 John Miller [MSFT] 2015-08-12 13:45:21 UTC
I moved the code to the ViewDidLoad and it does not hang. Instead, IsHostReachable returns true, even with 100% packet loss - which seems wrong as the host is not reachable.
Comment 5 Joseph Hanna 2015-11-29 19:50:59 UTC
Hi guys,

I also have IsHostReachable returns true when I set the "Settings -> Developer -> Status -> 100% loss".
Comment 6 Michael 2016-01-08 14:14:22 UTC
Hi,

Has anyone managed to confirm whether this is a defect yet?
Comment 7 kontakt 2016-04-10 23:03:43 UTC
I am experiencing exactly the same issue, inside Xamarin CrossConnectivity plugin. On iPhone 4 device it takes about 30 seconds, iOS 8 simulator about 20-30s, iOS 9 simulator about 5s. If called in FinishedLaunching, app crashes because of watchdog.
Comment 8 Alex Soto [MSFT] 2016-06-08 19:45:35 UTC
we will check if it is a bug on our side or apple is not giving us the right values
Comment 9 Prashant [MSFT] 2017-07-26 13:10:30 UTC
I can confirm using the latest Xamarin.iOS 10.12.0.14, the app no longer hangs but `IsHostReachable` returns `true`, even with 100% packet loss 

Marking this report as CONFIRMED.
Comment 10 Sebastien Pouliot 2017-10-24 14:49:03 UTC
SCNetworkReachabilityGetFlags (called from TryGetFlags) is a synchronous API [1] and should not be called in `FinishedLaunching` since the watchdog might kill the process if it takes too long.

Even with 100% packet loss iOS' SCNetworkReachabilityGetFlags returns 0 (Ok) and flags == Reachable. This _might_ be because the reachability status is cached (before being set to 100% packet loss). The internal of this code is not documented with enough details. 

However the meaning of reachable [2] does not mean a connection was done, only that the OS believe it can be done, i.e. reachable means the network configuration can be used to reach it [3]. IOW using reachability with packet loss does not work [4] like you expect.

note: The method `IsHostReachable` (mentioned in comment #9) is part of the user code (not XI).

[1] https://developer.apple.com/library/content/qa/qa1693/_index.html
[2] https://stackoverflow.com/a/728568/220643
[3] https://developer.apple.com/documentation/systemconfiguration/scnetworkreachabilityflags/kscnetworkreachabilityflagsreachable?language=objc
[4] https://stackoverflow.com/a/37190752/220643

Note You need to log in before you can comment on or make changes to this bug.