- Home /
Internet Connection Check using 204 HTTPStatusCode
I've been working on an Internet Connection Checker...
I've tried many things, from pinging to WebRequests, from RESTful APIs to socket beacons.
The one thing I found most reliable and performatic, considering Unity restrictions, was to make a WebRequest to a 'no content' web page. Such as Google's 204 Generator.
This will return a HttpWebResponse with the 'No Content' HttpStatusCode, which is labeled as number 204. This response has a length of 0 bytes, which means the only data that would be downloaded is the Header of the response.
Not only that, but since the page will return a fixed status code, you can check if the user is trapped inside a Walled Garden.
Although I didn't find any downsides on using this, I would like a second (and more) opinion on the topic.
For instance, would this method be suited for constant streaming games? Such as MOBAs or real time multiplayer games? Is the overhead of a WebRequest plus the header from the WebResponse large enough for it to be not performatic data wise? Is this a reliable way to check for internet connection? Are there any problems worth mentioning? Have you guys ever tried this on a large scale project?
Thank you!
Ps.: Below is a simplified version of what I mean.
public enum ConnectionStatus
{
ERROR,
NO_DNS_CONNECTION,
WALLED_GARDEN,
CONNECTED
}
public static class ConnectionChecker
{
private static Uri google204 = new Uri("http://clients3.google.com/generate_204");
private static Thread checkerThread = null;
private static bool threadIsRunning = false;
private static bool threadShouldStop = false;
public static ConnectionStatus Status { get; private set; }
public static void StartConnectionCheck ()
{
if (threadIsRunning && !threadShouldStop)
return;
if (checkerThread == null)
checkerThread = new Thread (CheckConnection);
checkerThread.Start ();
}
public static void StopConnectionCheck ()
{
threadShouldStop = true;
}
private static void CheckConnection ()
{
threadIsRunning = true;
while (!threadShouldStop)
{
WebRequest request;
HttpWebResponse response;
try
{
request = WebRequest.Create (google204);
response = (HttpWebResponse) request.GetResponse();
}
catch (WebException webException)
{
Status = ConnectionStatus.NO_DNS_CONNECTION;
continue;
}
catch (Exception e)
{
Status = ConnectionStatus.ERROR;
continue;
}
if (response.StatusCode == HttpStatusCode.NoContent)
Status = ConnectionStatus.CONNECTED;
else
Status = ConnectionStatus.WALLED_GARDEN;
Thread.Sleep(1000);
threadShouldStop = threadShouldStop || ThreadShouldStop();
}
threadIsRunning = false;
threadShouldStop = false;
}
private static bool ThreadShouldStop ()
{
return Thread.CurrentThread.ThreadState == ThreadState.StopRequested ||
Thread.CurrentThread.ThreadState == ThreadState.SuspendRequested ||
Thread.CurrentThread.ThreadState == ThreadState.AbortRequested;
}
}
Your answer
Follow this Question
Related Questions
UnityWebRequest object downloadhandler.text not returning same/all data compared to browser 0 Answers
Unable to call external API (IBM Watson) via HTTP request? 1 Answer
Network HLAPI - How do I block the entrance of new clients to a server? 0 Answers
UnityWebRequest returning responseCode 0 and isNetworkError == true for Unity 2019 1 Answer